`

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.

 

^_^[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") } ] }
 

 

 

相关数据存放在一起,针对性的查询可以消除join,性能比分散存储要高且方便

 

 

在关系型数据库中,通过连接运算符可以实现多个表联合查询。而非关系型数据库的特点是表之间属于弱关联,Mongodb作为Nosql代表,其本身特性不建议对多Collection关联处理,不过对于有些需要对多表关联处理的需求,Mongodb也可以实现。主要分为两种方式:简单手工关联和DBRef方式关联

 

1.简单手工关联

下图表示帖子和用户两个Collection的ER图:

首先将authors集合中的用户对象查询出来,放在一个变量author中,代码如下:

Shell代码 复制代码 收藏代码
  1. > author=db.authors.findOne({name:"chenzhou"})   
  2. {   
  3.     "_id" : ObjectId("5030ba7621bdee44765b2147"),   
  4.     "name" : "chenzhou",   
  5.     "email" : "chenzhou1025@126.com"  
  6. }  
> author=db.authors.findOne({name:"chenzhou"})
{
	"_id" : ObjectId("5030ba7621bdee44765b2147"),
	"name" : "chenzhou",
	"email" : "chenzhou1025@126.com"
}

通过用户对象author来获取帖子列表,代码如下:

Shell代码 复制代码 收藏代码
  1. > for(var post=db.posts.find({"author_name":author.name}); post.hasNext();){   
  2. ... printjson(post.next().title);   
  3. ... }   
  4. "Hello Mongodb"  
  5. "Hello World"  
  6. "Hello My Friend"  
> for(var post=db.posts.find({"author_name":author.name}); post.hasNext();){
... printjson(post.next().title);
... }
"Hello Mongodb"
"Hello World"
"Hello My Friend"

2.DBRef方式关联

DBRef就是在两个Collection之间定义的一个关联关系,比如,把CollectionB "_id"列的值存在CollectionA的一个列中,然后通过CollectionA这个列中所存的值在CollectionB中找到相应的记录。

示例:模拟用户发帖的过程,看一看如何将帖子表和用户表建立关联。

步骤1:取得当前用户信息,代码如下:

Shell代码 复制代码 收藏代码
  1. > author=db.authors.find({name:"chenzhou"})[0]   
  2. {   
  3.     "_id" : ObjectId("5030ba7621bdee44765b2147"),   
  4.     "name" : "chenzhou",   
  5.     "email" : "chenzhou1025@126.com"  
  6. }  
> author=db.authors.find({name:"chenzhou"})[0]
{
	"_id" : ObjectId("5030ba7621bdee44765b2147"),
	"name" : "chenzhou",
	"email" : "chenzhou1025@126.com"
}

步骤2:发帖子并做关联,代码如下: 

Shell代码 复制代码 收藏代码
  1. > db.posts.insert({"title":"Hello Mongodb DBRef1",   
  2. ... authors:[new DBRef('authors',author._id)]})   
  3. > db.posts.insert({"title":"Hello Mongodb DBRef2",   
  4. ... authors:[new DBRef('authors',author._id)]})   
  5. >  
> db.posts.insert({"title":"Hello Mongodb DBRef1",
... authors:[new DBRef('authors',author._id)]})
> db.posts.insert({"title":"Hello Mongodb DBRef2",
... authors:[new DBRef('authors',author._id)]})
>

步骤3:通知帖子查找用户信息,代码如下:

Shell代码 复制代码 收藏代码
  1. >  db.posts.find({"title":"Hello Mongodb DBRef1"})[0].authors[0].fetch()   
  2. {   
  3.     "_id" : ObjectId("5030ba7621bdee44765b2147"),   
  4.     "name" : "chenzhou",   
  5.     "email" : "chenzhou1025@126.com"  
  6. }  
>  db.posts.find({"title":"Hello Mongodb DBRef1"})[0].authors[0].fetch()
{
	"_id" : ObjectId("5030ba7621bdee44765b2147"),
	"name" : "chenzhou",
	"email" : "chenzhou1025@126.com"
}

通过这个例子可以看出,DBRef就是从文档的一个属性指向另一个文档的指针。

关于DBRef详细信息,可以参见官网说明:http://docs.mongodb.org/manual/applications/database-references/  

 

分享到:
评论

相关推荐

    Thinkphp使用mongodb数据库实现多条件查询方法

    在Thinkphp中实现多条件查询时,可以使用框架提供的查询构建器(Query Builder),但是当涉及到MongoDB的复合查询时,比如需要使用AND和OR逻辑运算符进行多条件筛选,官方文档中提供的方法可能不足以满足需求。...

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

    在传统的关系型数据库中,多表关联查询是通过JOIN操作来实现的,而在MongoDB中,由于其非关系性的特性,没有直接的JOIN操作。但是,可以通过一些方式实现类似的功能,如引用和聚合操作。 在MongoDB中,多表关联查询...

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

    在处理复杂的查询需求时,尽管 MongoDB 是非关联数据库,但它提供了一种称为 `population` 的机制来实现关联表查询,允许用户在查询时连接不同的集合,类似于关系数据库中的JOIN操作。 Population 是一种在MongoDB...

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

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

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

    在设计 MongoDB 数据库时,考虑到其非关系型特性,一般推荐避免过多的联表查询,而是倾向于将关联数据嵌入到同一个文档中,以减少查询复杂性。然而,在某些场景下,如需要处理大量数据的关联分析时,`$lookup` 和 `...

    mongoDB实现BOM表多试图转换

    在本文中,我们将深入探讨如何利用MongoDB和Java来实现BOM表的多视图转换。 首先,理解BOM表的基本概念。BOM是制造业中用于描述产品结构的工具,它列出了一项产品所需的所有组件和子组件,以及它们的数量关系。在...

    MongoDB查询练习题及答案

    以上仅是 MongoDB 查询的一些基本操作,实际上,MongoDB 提供了更多高级查询功能,如聚合框架、正则表达式匹配、地理空间查询等。学习并熟练掌握这些查询技巧,对于有效管理和分析 MongoDB 数据库中的数据至关重要。

    mongoDB-查询语法

    在 MongoDB 中,基本查询语法为 `db.collection.find()`,其中 `db` 代表当前数据库,`collection` 代表当前集合(或表)。例如,`db.users.find()` 将查找 `users` 集合中的所有记录。 条件查询 在 MongoDB 中,...

    mongodb查询工具Studio3T

    如果您不习惯MongoDB查询语言,那么Studio3T的SQL查询可能会派上用场。编写SQL选择表达式和SQL联接来查询mongodb,并查看SQL查询如何转换为MQL——这是一个很好的工具。SQL查询语言

    非关联数据库mongodb 的demo

    在这个“非关联数据库mongodb的demo”中,我们可以探索MongoDB的一些核心特性以及如何使用它来存储和查询数据。 MongoDB采用文档型的数据模型,其中数据以JSON(JavaScript Object Notation)格式的文档存储。这种...

    Java操作mongodb的模糊查询和精确查询

    Java操作MongoDB的模糊查询和精确查询 Java操作MongoDB的模糊查询和精确查询是 MongoDB 中常用的查询方式,使用 Java 语言可以通过 MongoDB 的 Java 驱动程序来实现各种查询操作。在本文中,我们将详细介绍 Java ...

    mongodb数据库基础知识之连表查询

    本篇文章将深入探讨MongoDB中的连表查询,即如何在多个集合之间进行数据关联。 ### 1. MongoDB正则匹配 MongoDB提供了正则表达式匹配功能,用于在查询中查找符合特定模式的字符串。这在处理模糊查询或复杂文本匹配...

    hive关联MongoDB

    总的来说,在Hive与MongoDB进行关联操作时,需要考虑数据类型转换、配置连接信息、处理日期时区问题,以及在创建表时注意指定外部表并正确设置表属性和存储处理器等关键配置。这些都是在数据迁移过程中需要注意的...

    1亿条记录的MongoDB数据库随机查询性能测试

    这种并发查询的方式可以模拟多用户同时访问数据库的场景,以评估MongoDB在高并发下的性能表现。 在测试脚本`mselectmongodb.py`中,定义了一个`SqlToMongo`类,包含了执行MongoDB查询的方法`m_sql()`。`gen_load()`...

    .net 中使用MongoDB.Driver 多条件动态拼接查询

    using MongoDB.Bson; using MongoDB.Driver; 按指定用户名,指定日期查询数据 string username=lee;//定义用户名 string[] Dates = new string[] { 2020-03-05, 2020-03-02,2020-03-06};//定义时间段,数量不限 List...

Global site tag (gtag.js) - Google Analytics