1. document的关系
多个文档之间在逻辑上可以相互联系,可以通过嵌入和引用来建立联系。
文档之间的关系可以有:
- 1对1
- 1对多
- 多对1
- 多对多
一个用户可以有多个地址,所以是一对多的关系。
#user document { "_id":ObjectId("52ffc33cd85242f436000001"), "name": "Tom Hanks", "contact": "987654321", "dob": "01-01-1991" } #address document { "_id":ObjectId("52ffc4a5d85242602e000000"), "building": "22 A, Indiana Apt", "pincode": 123456, "city": "Los Angeles", "state": "California" }
(1) 嵌入式关联:把用户地址嵌入到用户的文档中
{ "_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})
缺点:如果用户和用户地址在不断增加,数据量不断变大,会影响读写性能。
(2) 引用关联:把用户数据文档和用户地址数据文档分开,通过引用文档的 id 字段来建立关系。
{ "_id":ObjectId("52ffc33cd85242f436000001"), "contact": "987654321", "dob": "01-01-1991", "name": "Tom Benzamin", "address_ids": [ ObjectId("52ffc4a5d85242602e000000"), ObjectId("52ffc4a5d85242602e000001") ] }
这种方法需要两次查询,第一次查询用户地址的对象id(ObjectId),第二次通过查询的id获取用户的详细地址信息。
2. 数据库引用