首先要记一下根据 DBREF 的ObjectId 以及根据 ref 集合为条件查询问题.

在不同的可视化客户端里面显示的问题.

//某客户端显示这样,直接CMD查询也是这样显示.这样我无法看懂find条件
{
"_id" : ObjectId("58ae865f7dde420cd0eae39f"),
"className" : "com.thesys.morphia.dbref.DbrefTest$Book",
"price" : "60.0",
"author" : DBRef("Author", ObjectId("58ae865f7dde420cd0eae39e"))
}

换了一个客户端

//同一个数据显示的格式,根据这样尝试查询
{
"_id" : ObjectId("58ae865f7dde420cd0eae39f"),
"className" : "com.thesys.morphia.dbref.DbrefTest$Book",
"price" : "60.0",
"author" : {
"$ref" : "Author",
"$id" : ObjectId("58ae865f7dde420cd0eae39e")
}
}

以下两个shell均可查询

db.Book.find({"author.$ref":"Author"})

db.Book.find({"author.$id":ObjectId("58ae865f7dde420cd0eae39e")})

以下是我的测试代码,使用morphia

@RunWith(JUnit4.class)
public class DbrefTest { static final Morphia morphia = new Morphia();
static final Datastore datastore = morphia.createDatastore(new MongoClient(),"BookTest");
@Entity
static class Book{
@Id
private ObjectId id;//id
private String name;//书名
private double price;//价格
@Reference
private Author author;
}
@Entity
static class Author{
@Id
private ObjectId id;//id
private String name;//作者名称
private String nationality;//国籍
} public static void main(String[] args) {
Author author = new Author();
author.setName("大仲马");
author.setNationality("法国");
datastore.save(author);
Book book = new Book();
book.setAuthor(author);
datastore.save(book);
} @Test
public void testQuery(){
Query<Book> query = datastore.createQuery(Book.class);
System.out.println(query.count());
List<Book> books = query.asList();
System.out.println(books.get(0).getAuthor().getName());
} @Test
public void testUpdate(){
//注意根据ID查询不能传入String 必须是ObjectId
Query<Book> query = datastore.createQuery(Book.class).field("_id").equal(new ObjectId("58ae7f837dde423968454e62"));
// System.out.println(query.get().price);//直接获取结果集第一个
// datastore.get(Book.class,new ObjectId("58ae7f837dde423968454e62")).price //直接根据ID查询一个文档
UpdateOperations<Book> updateOperation = datastore.createUpdateOperations(Book.class).set("name","三个火枪手").set("price", 55);
datastore.updateFirst(query, updateOperation);//.更新第一个找到的
}   //聚合管道,投射
  @Test
  public void testAggregation(){
    //把price 重命名为 name
    AggregationPipeline aggregationPipeline = datastore.createAggregation(Book.class).project(Projection.projection("name","price"));
    Iterator<Book> books = aggregationPipeline.aggregate(Book.class);
    System.out.println(books.next().getName());//打印出name : 60.0
  } }

MongoDB的DBREF 使用.的更多相关文章

  1. MongoDB之DBref(关联插入,查询,删除) 实例深入

    http://blog.csdn.net/crazyjixiang/article/details/6668288 suppose I have the following datastructure ...

  2. Ubuntu 10.04上安装MongoDB

    MongoDB是一个可扩展.高性能的下一代数据库.MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系.文档可能由 以下几 部分组成:独立的基本类型属性.“内嵌文档”或文档数组 ...

  3. mgo中DBRef-数据添加测试

    2014-1-25 在设计mongo数据库时遇到这样一个问题,日志信息表需要引用人员信息表的数据.如果是结构化数据库,基本上不用想太多的东西.由于刚接触非结构化数据库,按着书上的理解由于日志数量较多, ...

  4. MongoDB学习-->Gridfs分布式存储&DBRef关联查询

    mongodb自带的一个分布式文件系统 fs.files _id filename md5 size uploaddate contenttype metadata {"user_id&qu ...

  5. MongoDB 学习笔记之 DBRef

    DBRef: MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).内嵌比较好理解,就是字段内容是个数组,数组内再包含文档,而我们今天介绍的是另一种,称为链接DBRef.由 ...

  6. mongodb 多表关联处理 : 内嵌以及连接(手动引用、DBref) 、aggregate中$lookup

    MongoDB与关系型数据库的建模还是有许多不同,因为MongoDB支持内嵌对象和数组类型.MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).那么何时Embed何时Li ...

  7. Spring DATA MongoDB @DBref查询,or和and联合查询

    @DBref文档关联,在按该类型查询的时候,在字段名后加上关联表的字段名即可,如: Criteria.where("bloggroup.$id"), $id代表关联表的oid字段. ...

  8. MongoDB 学习笔记之 Nested doc/DBRef (Spark)

    Nested doc/DBRef (Spark) 实现: 运行结果:

  9. MongoDB基础

    1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...

随机推荐

  1. 输入和输出--File类

    输入和输出 写在前面的:Java中的输入和输出还是比较重要的,之前我都没想整理IO和多线程的,但是在研究后面的好多东西时候,经常要读取资源文件,这个时候就不得不回过头来整理IO了.要玩熟Java的输入 ...

  2. jQuery的Nicescroll滚动条插件使用方法

    Nicescroll滚动条插件是一个非常强大的基于jQuery的滚动条插件,不需要增加额外的css,几乎全浏览器兼容.ie6+,实现只需要一段代码,侵入性非常小,样式可完全自定义,支持触摸事件,可在触 ...

  3. PHP 构造方法 __construct()(转)

    PHP 析构方法 __destruct() 构造方法是类中的一个特殊方法.当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() . 在一个类中只能声 ...

  4. linux socket 编程(C语言)[转]

    最近看了一些网络编程的书籍,一直以来总感觉网络编程神秘莫测,其实网络编程入门还是很容易学的,下面这些代码是我在linux下编写的,已经运行过了,编译之后就可以运行了.有不足之处希望大家多多指出,共同学 ...

  5. 基于 HTML5 WebGL 的 3D SCADA 主站系统

    这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 的模拟一般需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算是我对这次项 ...

  6. java 对象、集合的非空判断

    自我总结,有什么不到位的地方,请各位纠正补充,感激不尽! 目的:使程序更严谨 ***对象验证是否不为空:  if( null != obj ) ***List验证不为空:if( null != lis ...

  7. 客户端putty xshell连接linux中vim不能正常使用小键盘的问题

    在putty或xshell上用vi/vim的时候,开NumLock时按小键盘上的数字键并不能输入数字,而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键). 解决方法: putty:选项Te ...

  8. Python CRM项目三

    1.分页: 分页使用Django内置的分页模块来实现 官方的分页案例 from django.core.paginator import Paginator, EmptyPage, PageNotAn ...

  9. CTSC 2017 滚粗记

    CTSC 2017 滚粗记 结束好几天了一直没写. 明天就要去参加二轮省选了,填一下坑吧. 所以可能很多东西已经忘了 Day -2 [5.5 Fri] 周五晚上是其他学信竞的同学来机房的时间... 也 ...

  10. POJ 3608 Bridge Across Islands [旋转卡壳]

    Bridge Across Islands Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10455   Accepted: ...