MongoDB 的關係表示多個文檔之間在邏輯上的相互聯繫。數據庫
文檔間能夠經過嵌入和引用來創建聯繫。數組
MongoDB 中的關係能夠是:數據結構
接下來咱們來考慮下用戶與用戶地址的關係。性能
一個用戶能夠有多個地址,因此是一對多的關係。ui
如下是 user 文檔的簡單結構:spa
{ "_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" }
使用嵌入式方法,咱們能夠把用戶地址嵌入到用戶的文檔中:code
"_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})
注意:以上查詢中 db 和 users 表示數據庫和集合。ci
這種數據結構的缺點是,若是用戶和用戶地址在不斷增長,數據量不斷變大,會影響讀寫性能。
引用式關係是設計數據庫時常常用到的方法,這種方法把用戶數據文檔和用戶地址數據文檔分開,經過引用文檔的 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"]}})