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