第32章 MongoDB 关系教程

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 表示database和集合。

这种数据结构的缺点是,如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。

引用式关系

引用式关系是设计database时经常用到的方法,这种方法把用户数据文档和用户地址数据文档分开,通过引用文档的 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"]}})

本专栏所有文章

第1章 MongoDB 教程

第2章 NoSQL 简介教程

第3章 MongoDB 简介教程

第4章 Windows MongoDB教程

第5章 Linux MongoDB教程

第6章 OSX MongoDB教程

第7章 MongoDB 概念解析教程

第8章 MongoDB 连接教程

第9章 MongoDB 创建数据库教程

第10章 MongoDB 删除数据库教程

第11章 MongoDB 创建集合教程

第12章 MongoDB 删除集合教程

第13章 MongoDB 插入文档教程

第14章 MongoDB 更新文档教程

第15章 MongoDB 删除文档教程

第16章 MongoDB 查询文档教程

第17章 MongoDB 条件操作符教程

第18章 MongoDB $type 操作符教程

第19章 MongoDB Limit与Skip方法教程

第20章 MongoDB 排序教程

第21章 MongoDB 索引教程

第22章 MongoDB 聚合教程

第23章 MongoDB 复制(副本集)教程

第24章 MongoDB 分片教程

第25章 MongoDB 备份与恢复教程

第26章 MongoDB 监控教程

第27章 MongoDB Java教程

第28章 MongoDB PHP 扩展教程

第29章 MongoDB PHP教程

第30章 MongoDB PHP7教程

第31章 Node.js MongoDB教程

第32章 第32章 MongoDB 关系教程教程

第33章 MongoDB 数据库引用教程

第34章 MongoDB 覆盖索引查询教程

第35章 MongoDB 查询分析教程

第36章 MongoDB 原子操作教程

第37章 MongoDB 高级索引教程

第38章 MongoDB 索引限制教程

第39章 MongoDB ObjectId教程

第40章 MongoDB Map Reduce教程

第41章 MongoDB 全文检索教程

第42章 MongoDB 正则表达式教程

第43章 MongoDB 管理工具教程

第44章 MongoDB GridFS教程

第45章 MongoDB 固定集合教程

第46章 MongoDB 自动增长教程