《MongoDB管理与开发精要》——3.3节联合查询

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 本节书摘来自华章社区《MongoDB管理与开发精要》一书中的第3章,第3.3节联合查询,作者:红 丸,更多章节内容可以访问云栖社区“华章社区”公众号查看

3.3 联合查询
通过连接运算符可以实现多个表联合查询。连接是关系型数据库模型的主要特点,也是它区别于其他类型数据库管理系统的一个标志。
在关系型数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中。当检索数据时,通过连接操作查询出存放在多个表中的不同实体的信息。连接操作的灵活性给用户带来很大的方便,它们可以在任何时候增加新的数据类型、为不同实体创建新的表,而后通过连接进行查询。
其实由于MongoDB本身的特点,不建议用多collection关联处理,但有些需求必须进行关联处理,因此,我们可以用两种方法去应付这类需求:简单手工关联和DBRef方式关联。

3.3.1 简单手工关联
本小节模拟用户在论坛上查看帖子列表的场景,图3-1是帖子和用户这两个collection的ER图。


a09e81163603cfd6e9428ebf9f7f4bff0dc52aa3

扩展阅读 ER图
ER图(Entity-Relation Diagram,实体联系图)用来建立数据模型,在数据库系统概论中属于概念设计阶段,形成一个独立于机器,独立于DBMS的ER图模型。 通常将它简称为ER图,相应地可把用ER图描绘的数据模型称为ER模型。ER图提供了表示实体(即数据对象)、属性和联系的方法,用来描述现实世界的概念模型。
下面演示如何通过用户名获得该用户发表过的帖子。
步骤1 取得用户对象“u”, 如下面的代码所示:

> u=db.users.findOne({author:"wangwenlong"}) 
{
        "_id" : ObjectId("4fe5624a5339f67c2fdbd129"),
        "author" : "wangwenlong",
        "email" : "wangwenlong@gmail.com"
}
步骤2 通过用户对象“u”来取得帖子列表, 如下面的代码所示:
> for( var p = db.postings.find({author:u.author}); p.hasNext(); ) {
...     printjson( p.next().title);
... }
"Hello MongoDB!"
"Hello China!"
"Hello Beijing!"

上例使用了一个for循环就一次性地将某用户的帖子标题都列出来了。本例中其实两张表并没有显式地定义过任何关系,在下面的例子中将看到另外一种联合查询的方法。
3.3.2 DBRef方式关联
DBRef就是在两个collection之间定义的一个关联,比如,把collectionB“_id”列的值存在collectionA的一个列中,然后通过collectionA这个列中所存的值在collectionB中找到相应的记录。
我们模拟一个用户发帖子的流程,看一看如何将帖子表和用户表建立关联的。
步骤1 取得当前用户信息, 如下面的代码所示:

> db.users.insert({name:"wangwenlong"})
> u1=db.users.find({name:"wangwenlong"})[0]
{ "_id" : ObjectId("4fe5be50c932987b1cf6a095"), "name" : "wangwenlong" }
步骤2 发帖子并做关联, 如下面的代码所示:
> db.postings.insert({"title" : "Hello MongoDB!", 
        users : [ new DBRef('users', u1._id) ] })
> db.postings.insert ({"title" : "Hello China!", 
        users : [ new DBRef('users', u1._id) ] })
步骤3 通知帖子查找用户信息, 如下面的代码所示:
> db.postings.find({title:"Hello China!"})[0].users[0].fetch()
{ "_id" : ObjectId("4fe5be50c932987b1cf6a095"), "name" : "wangwenlong" }

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

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
4月前
|
存储 NoSQL MongoDB
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!
4844 1
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
|
4月前
|
存储 NoSQL 算法
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用
作为中国香港本土的航空公司,国泰航空提供的客运和货运服务覆盖全球不同目的地。国泰航空清楚这个流程及其他许多关键业务级流程都需要进行数字化转型。国泰航空积极寻找可提高其运营效率、工作效率和可持续性能力的重大机会,优先开发创新性的数字解决方案。
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用
|
7月前
|
NoSQL Linux MongoDB
开发中MongoDB遇到的各种问题
开发中MongoDB遇到的各种问题
127 0
|
7月前
|
存储 NoSQL MongoDB
如何用MongoDB来进行开发
如何用MongoDB来进行开发
161 0
|
7月前
|
缓存 NoSQL Java
Spring Session MongoDB管理会话
Spring Session MongoDB管理会话
60 0
|
9月前
|
NoSQL 前端开发 JavaScript
MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建
MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建
121 0
|
9月前
|
NoSQL MongoDB 数据库
mongodb用户权限管理
用户权限管理简要说明
610 0
|
11月前
|
存储 NoSQL Cloud Native
【活动报名】阿里云MongoDB在游戏行业的开发实践
本期研讨会将MongoDB本身特性与游戏行业的场景相结合,简述阿里云数据库MongoDB版如何助力游戏行业应用的开发与架构优化,从而助力行业的发展,并分享相关案例作为参考。
|
存储 运维 NoSQL
阿里云数据库MongoDB助力南瓜电影提升开发效率——为超8000万观众量身打造沉浸式体验
阿里云数据库MongoDB助力南瓜电影提升开发效率——为超8000万观众量身打造沉浸式体验
253 0