如图所示,A,B,C三个Collection互相关联。 其中的数字为document的value值。
关于DBref的入门可以看 http://blog.csdn.net/crazyjixiang/article/details/6616678 这篇文章。
我们先建立A collection。
- > var a={value:"1"}
- > var b={value:"2"}
- > var c={value:"9"}
- > var d={value:"10"}
- > db.A.save(a)
- > db.A.save(b)
- > db.A.save(c)
- > db.A.save(d)
- > db.A.find()
- { "_id" : ObjectId("4e3f33ab6266b5845052c02b"), "value" : "1" }
- { "_id" : ObjectId("4e3f33de6266b5845052c02c"), "value" : "2" }
- { "_id" : ObjectId("4e3f33e06266b5845052c02d"), "value" : "9" }
- { "_id" : ObjectId("4e3f33e26266b5845052c02e"), "value" : "10" }
B collection以A collection的 _id为ObjectId("4e3f33de6266b5845052c02c")作为Apid
所以:
- > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:3}
- > db.B.save(Ba)
- > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:4}
- > db.B.insert(Ba)
- > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:7}
- > db.B.insert(Ba)
- > var Ba={Apid:[new DBRef('A',ObjectId("4e3f33de6266b5845052c02c"))],value:8}
- > db.B.insert(Ba)
- > db.B.find()
- { "_id" : ObjectId("4e3f3dd96266b5845052c035"), "Apid" : [ { "$ref" : "A", "$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 3 }
- { "_id" : ObjectId("4e3f3de16266b5845052c036"), "Apid" : [ { "$ref" : "A", "$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 4 }
- { "_id" : ObjectId("4e3f3dec6266b5845052c037"), "Apid" : [ { "$ref" : "A", "$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 7 }
- { "_id" : ObjectId("4e3f3df06266b5845052c038"), "Apid" : [ { "$ref" : "A", "$id" : ObjectId("4e3f33de6266b5845052c02c") } ], "value" : 8 }
C collection以B collection的 _id为 ObjectId("4e3f3de16266b5845052c036") 作为Apid
- > var Ca={Bpid:[new DBRef('B',ObjectId("4e3f3de16266b5845052c036"))],value:5}
- > db.C.save(Ca)
- > var Ca={Bpid:[new DBRef('B',ObjectId("4e3f3de16266b5845052c036"))],value:6}
- > db.C.save(Ca)
- > db.C.find()
- { "_id" : ObjectId("4e3f42f36266b5845052c03d"), "Bpid" : [ { "$ref" : "B", "$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 5 }
- { "_id" : ObjectId("4e3f42f96266b5845052c03e"), "Bpid" : [ { "$ref" : "B", "$id" : ObjectId("4e3f3de16266b5845052c036") } ], "value" : 6 }
查询
- <span style="font-size:16px;">> var a = db.B.findOne({"value":4})
- > a.Apid.forEach(function(ref){printjson(db[ref.$ref].findOne({"_id":ref.$id}));})
- { "_id" : ObjectId("4e3f33de6266b5845052c02c"), "value" : "2" }</span>
- > db.A.findOne({"_id":db.B.findOne().Apid[0].$id})
- { "_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.
------------------------------------------------------******************------------------------------------------------------------
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.
- ^_^[root@:/usr/local/mongodb/bin]#./mongo
- MongoDB shell version: 1.8.2
- connecting to: test
- > var a = {name:"C++"}
- > db
- test
- > db.language.save(a)
- > db.language.find()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- > var b = {name:"javascript"}
- > db.language.save(b)
- > db.language.find()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- { "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }
- > lan = {name:"obj1",computer:[new DBRef('language',a._id)]}
- {
- "name" : "obj1",
- "computer" : [
- {
- "$ref" : "language",
- "$id" : ObjectId("4da32c897d2de864e0448e06")
- }
- ]
- }
- > lan.computer[0]
- { "$ref" : "language", "$id" : ObjectId("4da32c897d2de864e0448e06") }
- > lan.computer[0].fetch()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- > db.language.insert(lan)
- > db.language.find()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- { "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }
- { "_id" : ObjectId("4da33b487d2de864e0448e08"), "name" : "obj1", "computer" : [ { "$ref" : "language", "$id" : ObjectId("4da32c897d2de864e0448e06") } ] }
- > db.language.findOne({name:"obj1"}).computer[0].fetch()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- > lan2 = {name:"obj2",computer:[new DBRef('language',b._id)]}
- {
- "name" : "obj2",
- "computer" : [
- {
- "$ref" : "language",
- "$id" : ObjectId("4da32cb17d2de864e0448e07")
- }
- ]
- }
- > db.language.insert(lan2)
- > db.language.find()
- { "_id" : ObjectId("4da32c897d2de864e0448e06"), "name" : "C++" }
- { "_id" : ObjectId("4da32cb17d2de864e0448e07"), "name" : "javascript" }
- { "_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多表关联查询操作。分享给大家供大家参考,具体如下: Mongoose的多表关联查询 首先,我们回忆一下,MySQL多表关联查询的语句: student表: calss表: 通过student的classId关联进行查询...
MongoDB的多表关联查询是数据库操作中的重要环节,尤其是在处理复杂数据关联时显得尤为重要。在NoSQL数据库中,由于缺乏传统SQL的JOIN操作,关联查询通常更为复杂。MongoDB引入了聚合框架,其中的$lookup操作符解决...
这在处理多表关联时非常有用,特别是在那些需要从多个集合中获取完整数据的场景下。 `populate` 方法是实现population的核心,它可以被应用于document、model或者query对象上。基本的用法如下: ```javascript ...
总的来说,在Hive与MongoDB进行关联操作时,需要考虑数据类型转换、配置连接信息、处理日期时区问题,以及在创建表时注意指定外部表并正确设置表属性和存储处理器等关键配置。这些都是在数据迁移过程中需要注意的...
在这个“非关联数据库mongodb的demo”中,我们可以探索MongoDB的一些核心特性以及如何使用它来存储和查询数据。 MongoDB采用文档型的数据模型,其中数据以JSON(JavaScript Object Notation)格式的文档存储。这种...
相比于传统的关系型数据库,MongoDB避免了复杂的多表关联,可以在单一文档中存储完整的业务数据,如电影、影评和影评回复,大大减少了数据模型设计的复杂性。 MongoDB的安装过程相对简单,主要步骤包括下载最新稳定...
7. 集群管理:对于部署在多节点上的MongoDB集群,可视化工具应支持配置和管理副本集、分片集群等,简化集群操作。 8. 故障排查:提供日志查看和错误提示,便于开发者快速定位和解决运行时的问题。 9. 源码开放:...
这使得在一个文档内可以保存关联数据,减少了对多表JOIN操作的需求。 2. **集合与文档**:在MongoDB中,数据被组织成集合(类似于关系数据库中的表),而集合由一系列文档组成。每个文档都是一个键值对的集合,这些...
定义一个或多个`<dataNode>`来关联`<dataHost>`和数据库名称: ```xml ``` 其中,`database`属性指定了MongoDB的具体数据库名称。 ##### 3.2 配置示例:Oracle 除了MongoDB外,Mycat还支持其他类型的...
2. 关联处理:在 MongoDB 中,通过内嵌文档可以避免频繁的关联操作,简化数据模型。但对大型关联数据,可以使用引用方式,不过这可能导致多次查询并缺乏跨表事务支持。 在设计 MongoDB 文档模式时,应优先考虑内嵌...
- **单文档与多文档**:根据业务需求选择合适的数据模型,单文档模型适用于关联紧密的数据,而多文档模型适用于关联较松散的数据。 - **嵌入式与引用式**:嵌入式模型将相关数据存储在同一文档中,而引用式模型则...
这使得MongoDB能够轻松地存储和处理复杂的数据模型,如树状结构、图形数据或者关联数组。 2. **集合与数据库**:在MongoDB中,数据组织成数据库、集合和文档。数据库是MongoDB中的顶级逻辑单元,类似传统数据库的...
4. **Jenssegers/Laravel-MongoDB库**:这个库允许开发者使用类似于Eloquent的语法来操作MongoDB,使得习惯了Laravel的开发者可以无缝过渡到MongoDB。它提供了模型、查询构建器、集合操作等功能,使得MongoDB的数据...
- **嵌入式数据模型**:在MongoDB中,你可以将相关数据嵌入到同一个文档中,减少JOIN操作,提高查询效率。 - **引用数据模型**:当关联数据过大或需要独立更新时,可以使用引用关系,类似于传统数据库的外键。 - ...
Jenssegers/Laravel-MongoDB还提供了关联(Relationships)、软删除(Soft Deleting)、分页(Pagination)等特性,使你可以充分利用MongoDB的优势,同时保持Laravel的开发体验。 在实际项目中,可能还需要根据需求...
为了简化数据库管理和操作,MongoDB推荐使用图形化管理工具,如Robo 3T、MongoDB Compass等,这些工具提供了直观的用户界面,使数据操作更加便捷。 总之,MongoDB以其卓越的性能、灵活的数据模型和丰富的功能,成为...