MongoDB教程
+ -

MongoDB 关系

2019-09-09 6 0

MongoDB 的关系表示多个文档之间在逻辑上的相互联系。
文档间可以通过嵌入和引用来建立联系。

MongoDB 中的关系可以是:

  • 1:1 (1对1)
  • 1: N (1对多)
  • N: 1 (多对1)
  • N: N (多对多)

接下来我们来考虑下用户与用户地址的关系。

一个用户可以有多个地址,所以是一对多的关系。

以下是 user 文档的简单结构:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "name": "Tom Hanks",
   "contact": "987654321",
   "dob": "01-01-1991"
}

以下是 address 文档的简单结构:

{
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "building": "22 A, Indiana Apt",
   "pincode": 123456,
   "city": "Los Angeles",
   "state": "California"
}

嵌入式关系

使用嵌入式方法,我们可以把用户地址嵌入到用户的文档中:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
}

以上数据保存在单一的文档中,可以比较容易的获取和维护数据。 你可以这样查询用户的地址:

>db.users.findOne({"name":"Tom Benzamin"},{"address":1})

注意:以上查询中 dbusers 表示数据库和集合。
这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。

引用式关系

引用式关系是设计数据库时经常用到的方法,这种方法把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系。

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

以上实例中,用户文档的 address_ids 字段包含用户地址的对象id(ObjectId)数组。
我们可以读取这些用户地址的对象id(ObjectId)来获取用户的详细地址信息。
这种方法需要两次查询,第一次查询用户地址的对象id(ObjectId),第二次通过查询的id获取用户的详细地址信息。

>var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
>var addresses = db.address.find({"_id":{"$in":result["address_ids"]}})

0 篇笔记 写笔记

MongoDB 覆盖索引查询
官方的MongoDB的文档中说明,覆盖查询是以下的查询:所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询结果。因为索引存在于RAM中,从索引中获取数据比通过扫描文档读取......
MongoDB 关系
MongoDB 的关系表示多个文档之间在逻辑上的相互联系。文档间可以通过嵌入和引用来建立联系。MongoDB 中的关系可以是:1:1 (1对1)1: N (1对多)N: 1 (多对1)N: N (多对多) 接下来我们来考虑下用户用户地址关系。一个用户可以有多个地址,所以是一对多的关系。以下是 u......
Perl POD 文档
Perl 中可以在模块或脚本中嵌入 POD(Plain Old Documentation) 文档。POD 是一种简单而易用的标记型语言(置标语言)。POD 文档使用规则:POD 文档以 =head1 开始, =cut 结束, =head1 前与 =cut 后添加一空行。Perl 会忽略 POD 中......
UNIX 用户管理命令
在本章中,我们将详细讨论Unix中的用户管理,Unix系统上有三种类型的帐户-Root 帐号 这也称为 superuser ,可以对系统进行完全不受限制的控制。System 系统帐号:系统帐户是操作特定于系统的组件所需的帐户,如邮件帐户和sshd帐户。 这些帐户通常是系统上某些特定功能所必需的,对它......
C++ 指向数组的指针
您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中:double balance[50];balance 是一个指向 &balance[0] ......
Python3 XML解析
什么是 XML?XML 指可扩展标记语言(eX tensible M arkup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习 XML 教程XML 被设计用来传输和存储数据。XML 是一套定义语义标记的规则,这些标记将文档分成许多部......
MongoDB 简介
什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>va......
Java 文档注释
Java 支持三种注释方式。前两种分别是 // 和 / / ,第三种被称作说明注释,它以 /** 开始,以 */ 结束。说明注释允许你在程序中嵌入关于程序的信息。你可以使用 javadoc 工具软件来生成信息,并输出到HTML文件中。说明注释,使你更加方便的记录你的程序信息。javadoc 标签ja......
MongoDB 自动增长
MongoDB 没有像 SQL 一样有自动增长的功能, MongoDB 的 _id 是系统自动生成的12字节唯一标识。但在某些情况下,我们可能需要实现 ObjectId 自动增长功能。由于 MongoDB 没有实现这个功能,我们可以通过编程的方式来实现,以下我们将在 counters 集合中实现_i......
SQLite 查询语句select
select用于数据库库记录,其查询结果以表的形式展示合用户。语法select语句在查询时需指定需要是查询的表名,查询的列名(如果需要查询所有列,可以用*来代替)和查询条件。查询条件是可根据实际需要指定,如不指定,则默认情况是查询所有数据。查询指定的列,各个列之间通过,分隔开SELECT c......
MongoDB 创建集合
本章节我们为大家介绍如何使用 MongoDB 来创建集合。MongoDB 中使用 createCollection() 方法来创建集合。语法格式:db.createCollection(name, options)参数说明:name: 要创建的集合名称options: 可选参数, 指定有关内存大小及......
MongoDB Map Reduce
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。MapReduce 命令以下是MapReduce的基本语法:>db.collec......
dedecms5.7原代码分析 用户登录
用户的登录:分离变量用户通过dede/login.php提交登录信息给dede/login.ph后,先是引入comm.inc.php,初始化全局参数,调用下面的函数进分变量分离 foreach(Array('_GET','_POST','_COOKIE&......
PHP MySQL Select查询数据
PHP mysql_query()函数用于执行select查询。 由于从PHP 5.5版本起,不推荐使用mysql_query()函数。现在,建议使用以下2种替代方法之一。mysqli_query()PDO::__query()在select查询中还有两个其他的MySQLi函数。mysqli_num......
Java Java 9 改进的 @Deprecated 注解
注解 @Deprecated 可以标记 Java API 状态,可以是以下几种:使用它存在风险,可能导致错误可能在未来版本中不兼容可能在未来版本中删除一个更好和更高效的方案已经取代它。Java 9 中注解增加了两个新元素: since 和 forRemoval 。since : 元素指定已注解的AP......
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!