首先要记一下根据 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
  } }

最新文章

  1. 问题解决——MFC Ribbon 响应函数 错乱 执行其他函数
  2. JQuery的一些简单操作01
  3. 面向amd64的XXX与与项目的目标平台“x86”不兼容
  4. (转) RSA算法原理(一)
  5. Sublime中增加格式化代码的快捷键
  6. vc如何编译链接opengl库
  7. 转:如何让LoadRunner实现多个场景运行?
  8. HTML学习(七)表格
  9. C语言博客作业--一二维数组
  10. PYTHON定义函数制作简单登录程序(详细)
  11. 管理者的情商EQ
  12. Ubuntu 16.04安装Nginx
  13. 【笔记】两个根因分析方法:5WHY&amp;10WHY
  14. Eclipse 中打开 python 交互窗口
  15. 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
  16. 53环境Jenkins新增工程配置
  17. Radio中REG
  18. linux释放页面缓存drop_caches
  19. Unity3d mesh合并,网格合并具体用法教程
  20. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误

热门文章

  1. tp5中设置指定的log日志,可单独建立文件夹和文件名
  2. SQL Server 2005的服务器角色(public)的问题
  3. IIS使用十大原则,(IIS过期时间,IIS缓存设置) 【转载】
  4. 从LINQ开始之LINQ to Objects(上)
  5. get请求中文乱码及get,post编码探究
  6. C程序结构
  7. PHP实现html字符实体转汉字
  8. wxpython发布还自己图标的程序
  9. ABP官方文档翻译 6.6 Javascript API
  10. Struts2的配置和一个简单的例子