MongoDB的DBREF 使用.
首先要记一下根据 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 使用.的更多相关文章
- MongoDB之DBref(关联插入,查询,删除) 实例深入
http://blog.csdn.net/crazyjixiang/article/details/6668288 suppose I have the following datastructure ...
- Ubuntu 10.04上安装MongoDB
MongoDB是一个可扩展.高性能的下一代数据库.MongoDB中的数据以文档形式存储,这样就能在单个数据对象中表示复杂的关系.文档可能由 以下几 部分组成:独立的基本类型属性.“内嵌文档”或文档数组 ...
- mgo中DBRef-数据添加测试
2014-1-25 在设计mongo数据库时遇到这样一个问题,日志信息表需要引用人员信息表的数据.如果是结构化数据库,基本上不用想太多的东西.由于刚接触非结构化数据库,按着书上的理解由于日志数量较多, ...
- MongoDB学习-->Gridfs分布式存储&DBRef关联查询
mongodb自带的一个分布式文件系统 fs.files _id filename md5 size uploaddate contenttype metadata {"user_id&qu ...
- MongoDB 学习笔记之 DBRef
DBRef: MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).内嵌比较好理解,就是字段内容是个数组,数组内再包含文档,而我们今天介绍的是另一种,称为链接DBRef.由 ...
- mongodb 多表关联处理 : 内嵌以及连接(手动引用、DBref) 、aggregate中$lookup
MongoDB与关系型数据库的建模还是有许多不同,因为MongoDB支持内嵌对象和数组类型.MongoDB建模有两种方式,一种是内嵌(Embed),另一种是连接(Link).那么何时Embed何时Li ...
- Spring DATA MongoDB @DBref查询,or和and联合查询
@DBref文档关联,在按该类型查询的时候,在字段名后加上关联表的字段名即可,如: Criteria.where("bloggroup.$id"), $id代表关联表的oid字段. ...
- MongoDB 学习笔记之 Nested doc/DBRef (Spark)
Nested doc/DBRef (Spark) 实现: 运行结果:
- MongoDB基础
1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...
随机推荐
- 《剑指offer》数组中出现次数超过数组长度一半的数字
题目: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如 ...
- Java并发系列[2]----AbstractQueuedSynchronizer源码分析之独占模式
在上一篇<Java并发系列[1]----AbstractQueuedSynchronizer源码分析之概要分析>中我们介绍了AbstractQueuedSynchronizer基本的一些概 ...
- C#高性能大容量SOCKET并发(八):通讯协议
协议种类 开发Socket程序有两种协议类型,一种是用文本描述的,类似HTTP协议,定义字符集,好处是兼容性和调试方便,缺点是解析文本会损耗一些性能:一种是用Code加结构体,定义字节顺序,好处是性能 ...
- 简述 Hibernate 和 JDBC 的区别、优缺点
1.hibernate是一个开源的.采用面向对象的思想实现ORM映射框架,它对jdbc进行了一层封装,对于数据库的连接.关闭.数据的持久化(增删改查).事务的管理都进行了封装,使得程序开发的时候可以用 ...
- KVM虚拟机绑定物理CPU进行性能调优
PS:前提是虚拟cpu总个数不多于物理cpu总个数. 绑定方法: 虚拟机的虚拟cpu有1个,实体机物理cpu有8个,可以通过以下方式绑定cpu,绑定的动作不一定要在虚机启动时,可以在任何时候: 绑 ...
- strcpy和memcpy
切记,memcpy的头文件是memory.hstrcpy和memcpy主要有以下3方面的区别.1.复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体 ...
- Python之算法
一.什么算法 算法:一个计算过程,解决问题的方法 二.时间复杂度 看代码: ...
- 分布式唯一id:snowflake算法思考
匠心零度 转载请注明原创出处,谢谢! 缘起 为什么会突然谈到分布式唯一id呢?原因是最近在准备使用RocketMQ,看看官网介绍: 一句话,消息可能会重复,所以消费端需要做幂等.为什么消息会重复后续R ...
- shared_ptr模版推导的问题
问题描述 今天在帮同事解决问题时,发现了这个比较有意思的现象,特记录下来备忘. 问题是这样的,同事开发的是应用程序动态库模块,通过应用的框架中以接口方式供外部使用.然后他想对这些接口生命周期进行控制, ...
- CocosCreator游戏开发---菜鸟学习之路(二)SocketIO简易教程
请先参考教程司令部-SocketIO教程进行相关操作 开发完成后部分用户会出现持续输出 a userConnected的BUG 如下图所示 经过一段时间的BUG检查终于发现了问题所在.每个人碰到的情况 ...