首先要记一下根据 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. robotframework安装及入门指南

    将很久之前自己在本地记录的一些笔记发表到随笔来,希望能够帮到一些童鞋~ robotframework安装及入门指南 本文主要介绍robotframework在windows环境的安装过程! 安装步骤 ...

  2. selenium-java web自动化测试工具

    本篇文章由来,这两天整理了下自己经常使用而且很熟练的项目,今天突然想起漏了一个,补上了,但想到还没对应的博客,那就写一个简单的 我经常使用且相对熟练的部分技术如下(不知道算不算各位大神眼中的辣鸡): ...

  3. 【转】GPS定位原理

    一.距离测定原理 1.伪距测量 伪距测量是利用全球卫星定位系统进行导航定位的最基本的方法,其基本原理是:在某一瞬间利用GPS接收机同时测定至少四颗卫星的伪距,根据已知的卫星位置 和伪距观测值,采用距离 ...

  4. java根据模板导出pdf

    在网上看了一些Java生成pdf文件的,写的有点乱,有的不支持写入中文字体,有的不支持模板,有的只是随便把数据放里面生成文件,完全不考虑数据怎样放置的以及以后的维护性,想想还是自己总结一个完全版的导出 ...

  5. cat写入数据

    1.cat可以利用两个>>把内容追加到文件中 cat >>oldboy.txt<<EOF >1 >2 >EOF 会在文件中加入EOF中间的数据.E ...

  6. 简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等

    需求1:订单号要求唯一.长度不太长.自增.但不能通过早上订单号和晚上订单号相减推算出平台大概一天的单量 需求2:要求生成10w张优惠券,要求券码唯一.不能太长,不能轻易猜测出其他券码 根据这些需求提供 ...

  7. HTML中的表单

    1.HTML中表单元素的基本概念 HTML表单是HTML元素中较为复杂的部分,表单往往和脚本,动态页面,数据处理等功能相结合,因此是制作动态网站很重要的内容. 表单一般用来收集用户的输入信息 2.表单 ...

  8. 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识

    从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...

  9. BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]

    4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...

  10. POJ2318 TOYS[叉积 二分]

    TOYS Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14433   Accepted: 6998 Description ...