MongoDB关系

MongoDB 的关系表示多个文档之间在逻辑上的相互联系。

文档间可以通过嵌入和引用来建立联系。

MongoDB 中的关系跟MySQL类似,同样可以实现一下四种关系。

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

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

下面是一个user的简单文档

db.user.insert({"_id":ObjectId("52ffc33cd85242f436000001"),
                "name": "liuyifei",
                "gender":"0"

                })

address 的简单文档

db.address.insert({
   "_id":ObjectId("52ffc4a5d85242602e000000"),
   "city": "guangzhou",
   "postcode":"510000"
})

嵌入式关系

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

db.user.insert({"_id":ObjectId("52ffc33cd85242f436000002"),
                "name": "zhaolei",
                "gender":"0",
                "address":[{"city": "guangzhou","postcode":"510000"},
                           {"city": "shengzhen","postcode":"510000"}
                            ]
                })

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

 db.user.findOne({"name":"zhaolei"},{"address":true})

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

引用式关系

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

> 
> db.address.find()
{ "_id" : ObjectId("52ffc4a5d85242602e000000"), "city" : "guangzhou", "postcode" : "510000" }
{ "_id" : ObjectId("52ffc4a5d85242602e000001"), "city" : "shengzhen", "postcode" : "510000" }
> 
> 
> 
> 
> 
> 
> db.user.insert(
... {
...    "_id":ObjectId("52ffc33cd85242f436000003"),
...   
...    "name": "zhouxingchi",
...    "address_ids": [
...       ObjectId("52ffc4a5d85242602e000000"),
...       ObjectId("52ffc4a5d85242602e000001")
...    ]
... })
WriteResult({ "nInserted" : 1 })
>

用户文档的 address_ids 字段包含用户地址的对象id(ObjectId)的列表。

如果这种关系需要查询出用户的详细地址名称,

var rest = db.user.findOne({"name":"zhouxingchi"},{"address_ids":1})
db.address.find({"_id":{"$in":rest["address_ids"]}})
数据库基础 all right reserved,powered by Gitbook文件修订时间: 2018-05-10 15:19:08