`

MongoDB的多表关联操作

 
阅读更多

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

 

如图所示,A,B,C三个Collection互相关联。 其中的数字为document的value值。

关于DBref的入门可以看 http://blog.csdn.net/crazyjixiang/article/details/6616678 这篇文章。

我们先建立A collection。

 

[cpp] view plaincopy
 
  1. > var a={value:"1"}  
  2. > var b={value:"2"}  
  3. > var c={value:"9"}  
  4. > var d={value:"10"}  
  5. > db.A.save(a)  
  6. > db.A.save(b)        
  7. > db.A.save(c)   
  8. > db.A.save(d)  
  9. > db.A.find()                                                                                                 
  10. "_id" : ObjectId("4e3f33ab6266b5845052c02b"), "value" : "1" }  
  11. "_id" : ObjectId("4e3f33de6266b5845052c02c"), "value" : "2" }  
  12. "_id" : ObjectId("4e3f33e06266b5845052c02d"), "value" : "9" }  
  13. "_id" : ObjectId("4e3f33e26266b5845052c02e"), "value" : "10" }  

B collection以A collection的  _id为ObjectId("4e3f33de6266b5845052c02c")作为Apid

 

所以:

 

[cpp] view plaincopy
 
  1. > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:3}                        
  2. > db.B.save(Ba)  
  3. > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:4}  
  4. > db.B.insert(Ba)                                                              
  5. > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:7}  
  6. > db.B.insert(Ba)                                                              
  7. > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:8}  
  8. > db.B.insert(Ba)                                                              
  9. > db.B.find()  
  10. "_id" : ObjectId("4e3f3dd96266b5845052c035"), "Apid" : [ { "$ref" : "A""$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 3 }  
  11. "_id" : ObjectId("4e3f3de16266b5845052c036"), "Apid" : [ { "$ref" : "A""$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 4 }  
  12. "_id" : ObjectId("4e3f3dec6266b5845052c037"), "Apid" : [ { "$ref" : "A""$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 7 }  
  13. "_id" : ObjectId("4e3f3df06266b5845052c038"), "Apid" : [ { "$ref" : "A""$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 8 }  

 

C collection以B collection的  _id为 ObjectId("4e3f3de16266b5845052c036") 作为Apid

 

[cpp] view plaincopy
 
  1. > var Ca={Bpid:[new DBRef('B',ObjectId("4e3f3de16266b5845052c036"))],value:5}                        
  2. > db.C.save(Ca)                                                                
  3. > var Ca={Bpid:[new DBRef('B',ObjectId("4e3f3de16266b5845052c036"))],value:6}  
  4. > db.C.save(Ca)                                                                
  5. > db.C.find()  
  6. "_id" : ObjectId("4e3f42f36266b5845052c03d"), "Bpid" : [ { "$ref" : "B""$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 5 }  
  7. "_id" : ObjectId("4e3f42f96266b5845052c03e"), "Bpid" : [ { "$ref" : "B""$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 6 }  

 


目前为止3个collection 的关系已经建成。

查询


 

[cpp] view plaincopy
 
  1. <span style="font-size:16px;">> var a = db.B.findOne({"value":4})                                                       
  2. > a.Apid.forEach(function(ref){printjson(db[ref.$ref].findOne({"_id":ref.$id}));})  
  3. "_id" : ObjectId("4e3f33de6266b5845052c02c"), "value" : "2" }</span>  

 

[cpp] view plaincopy
 
  1. > db.A.findOne({"_id":db.B.findOne().Apid[0].$id})  
  2. "_id" : ObjectId("4e3f33de6266b5845052c02c"), "value" : "2" }  

 

其实好好想想引用不是必须的。

MongoDB 权威指南说了这么一句:

In short,the best time to use DBRefs are when you're storing heterogeneous references to documents in different collections.like when you want to take advantage of some additional DBRef-specific functionality in a driver or tool.



------------------------------------------------------******************------------------------------------------------------------

 

MongoDB Middle Level (关联多表查询)

 

DBRef is a more formal specification for creating references between documents.  DBRefs (generally) include a collection name as well as an object id.  Most developers only use DBRefs if the collection can change from one document to the next.  If your referenced collection will always be the same, the manual references outlined above are more efficient.

 

[sql] view plaincopy
 
  1. ^_^[root@:/usr/local/mongodb/bin]#./mongo  
  2. MongoDB shell version: 1.8.2  
  3. connecting to: test  
  4. > var a = {name:"C++"}                                                                                             
  5. > db   
  6. test  
  7. > db.language.save(a)  
  8. > db.language.find()  
  9. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  10. > var b = {name:"javascript"}  
  11. > db.language.save(b)  
  12. > db.language.find()  
  13. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  14. "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }  
  15. > lan = {name:"obj1",computer:[new DBRef('language',a._id)]}  
  16. {  
  17.         "name" : "obj1",  
  18.         "computer" : [  
  19.                 {  
  20.                         "$ref" : "language",  
  21.                         "$id" : ObjectId("4da32c897d2de864e0448e06")  
  22.                 }  
  23.         ]  
  24. }  
  25. > lan.computer[0]  
  26. "$ref" : "language""$id" : ObjectId("4da32c897d2de864e0448e06") }  
  27. > lan.computer[0].fetch()  
  28. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  29. > db.language.insert(lan)                                                                                          
  30. > db.language.find()  
  31. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  32. "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }  
  33. "_id" : ObjectId("4da33b487d2de864e0448e08"), "name" : "obj1""computer" : [ { "$ref" : "language""$id" : ObjectId("4da32c897d2de864e0448e06") } ] }  
  34. > db.language.findOne({name:"obj1"}).computer[0].fetch()                                                           
  35. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  36. > lan2 = {name:"obj2",computer:[new DBRef('language',b._id)]}       
  37. {  
  38.         "name" : "obj2",  
  39.         "computer" : [  
  40.                 {  
  41.                         "$ref" : "language",  
  42.                         "$id" : ObjectId("4da32cb17d2de864e0448e07")  
  43.                 }  
  44.         ]  
  45. }  
  46. > db.language.insert(lan2)  
  47. > db.language.find()  
  48. "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }  
  49. "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }  
  50. "_id" : ObjectId("4da33b487d2de864e0448e08"), "name" : "obj1""computer" : [ { "$ref" : "language""$id" : ObjectId("4da32c897d2de864e0448e06") } ] }  

建立关联对象:(PHP版)

http://www.php.net/manual/en/class.mongodbref.php/

http://www.php.net/manual/en/mongodb.createdbref.php

 

 

分享到:
评论

相关推荐

    MongoDB多表关联查询操作实例详解

    主要介绍了MongoDB多表关联查询操作,结合实例形式详细分析了MongoDB数据库实现多表关联查询的相关原理与实现技巧,需要的朋友可以参考下

    Mongodb实现的关联表查询功能【population方法】

    主要介绍了Mongodb实现的关联表查询功能,结合实例形式较为详细的分析了population方法实现关联表查询的原理与相关操作技巧,需要的朋友可以参考下

    MongoDB中多表关联查询($lookup)的深入讲解

    聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。 聚合管道操作主要包含下面几个部分: 命令 功能描述 $project 指定输出文档里的字段. $...

    MongoDB 原子操作

    MongoDB 原子操作 mongodb不支持事务,所以,在你的项目中应用时,要注意这点。...实例说明了在一个相同的文档中如何确保嵌入字段关联原子操作(update:更新)的字段是同步的。 book = { _id: 123456789,

    mongodb使用-增删改查、colleciton关联、_id作为主键实现update

    这篇主要是讲下mongodb数据库的操作。web前端通过ajax把数据按照yang的格式传给servlet,然后servlet再给相应的url传输,就是对应的yang文件的某个rpc,rpc收到后进行解析。

    MongoDB_Golang.zip

    做了连接池初始化,model层服务封装,提供:初始化MongoDB连接池复用, MongoDB集合(类似MySQL的数据表)的增、删、改、查,事务、管道操作、聚合操作、mongoShell原生命令执行、多表关联查询 等功能;另外明确一下...

    MongoDB 高级查询 aggregate 聚合管道

    使用聚合管道可以对集合中的文档进行变换和组合,常用于多表关联查询、数据的统计。 db.COLLECTION_NAME.aggregate() 方法用来构建和使用聚合管道,下图是官网给的实例,可以看出来聚合管道的用法还是比较简单的。 ...

    mongodb学习手册

    3. 数据库关联 七、 GridFS文件系统 八、 索引 九、 主(Master)/从(slave)数据库同步 1. 建立主/从服务器 2. 相关参数说明 3. Slave顶替Master 4. 切换Master/Slave角色 5. 更新主服务器位置 十、 ...

    mongodb实现同库联表查询方法示例

    最近在工作中遇到一个问题,需要对mongodb数据库进行联表查询操作,发现网上这方面的资料较少,无奈只能自己来实现了,下面话不多说了,来一起看看详细的介绍: 注意:这里只对同库联表查询做介绍,跨库联表查询可能...

    MongoDB各种查询操作详解

    一、find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询。 1、查询全部 空的查询文档{}会匹配集合的全部内容。如果不指定查询文档,默认就是{}。 2、部分查询 3、键的筛选 键...

    MongoDB教程之数据操作实例

    1. 批量插入:  以数组的方式一次插入多个文档可以在单次TCP请求...数据删除操作是不可恢复的,一旦删除就物理的删除了。对于全集合清除这种case,一个更为有效的方式是直接删除集合对象本身以及他关联的所有索引,之

    laravel-permission-mongodb:使用Laravel和MongoDB将用户与角色和权限相关联

    laravel-permission-mongodb 该软件包允许您管理数据库中的用户权限和角色。 它受到启发。 相同的代码在所有方面都相同,但与兼容安装后,您可以执行以下操作: // Adding permissions to a user$ user -&gt; ...

    WebApiMongoDB:将MongoDB与ASP.NET Web API和ASP.NET Core结合使用以执行CRUD操作并构建NotebookApp

    这是第一篇博客文章,介绍了与示例应用程序关联的后端:NotebookApp。 这是使用.NET Core 2使用MongoDB .NET驱动程序版本2来构建Web API层的快速演练。对数据库的所有调用都是异步的。 涵盖的主题 技术栈 配置模型...

    MongoDB知识点学习手册

    3. 数据库关联 ............................................................................................................. 14 七、 GridFS文件系统 .......................................................

    互联网新时代的Java ORM框架

    Bee简单易用:单表操作、多表关联操作,可以不用写sql,极少语句就可以完成SQL操作;Bee功能强大:复杂查询也支持向对象方式,分页查询性能更高,一级缓存即可支持个性化优化;具有分布式特性。高级要求,还可以方便...

    MongoDB学习手册

    3. 数据库关联 ............................................................................................................. 14 七、 GridFS文件系统 ........................................................

    ssm框架鲜花完整项目前台后台实现包含sql

    7.供应商以及mongoDB模块:关联了供应商表,用户表,角色表 (1)进行普通的增删该查,条件查询。(1)进行普通的增删该查,条件查询。 (2)在spring中集合mongoDB,通过AOP切点切入mongoDB。 (3)针对log记录进行...

    MyCat权威指南 更新于2018年7月25

    还能把 Oracle 的表跟 MySQL 的表做关联查询,你是否有一种不能呼吸的感觉?而未来,还能通过 Mycat 自动 将一些计算分析后的数据灌入到 Hadoop 中,并能用 Mycat+Storm/Spark Stream 引擎做大规模数据分析,看 到...

Global site tag (gtag.js) - Google Analytics