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