1. 程式人生 > 資料庫 >MongoDB 文件間的關係

MongoDB 文件間的關係

文件間可以通過嵌入和引用來建立聯絡。MongoDB 中的關係可以是:

  • 1:1 (1對1)

  • 1: N (1對多)

  • N: 1 (多對1)

  • N: N (多對多)

嵌入式關係

這種資料結構的缺點是,如果使用者和使用者地址在不斷增加,資料量不斷變大,會影響讀寫效能

文件巢狀的數量和深度沒有限制,但MongoDB目前版本限制一個文件最大為16MB

{
  "name": "Tom",
  "address": [
    {
        "city": "Los Angeles"
    },
    {
        "city": "Chicago"
    }]
}

只需要查詢一次

db.relation.find(
{"name":"tom"},{"address":1,"_id":0}
)

引用式關係

手動引用

引用式關係是設計資料庫時經常用到的方法,這種方法把使用者資料文件和使用者地址資料文件分開,通過引用文件的 id 欄位來建立關係

{
   "name":"jack",
"address_id":[
  ObjectId("5fcda6c686463b86f2650f78"),ObjectId("5fcda6d086463b86f2650f79")
  ]  
}

需要兩次查詢,第一次查詢使用者地址的物件id(ObjectId),第二次通過查詢的id獲取使用者的詳細地址資訊

var result=db.relation.findOne({"name":"jack"},{"address_id":1})
db.relation.find({"_id":{"$in":result["address_id"]}})

DBRefs

DBRef的形式:

{ $ref : , $id : , $db :  }

三個欄位表示的意義為:

  • $ref:集合名稱

  • $id:引用的id

  • $db:資料庫名稱,可選引數

{
   "name":"hjy",
   "address":{
       "$db":"test1",
       "$ref":"relation",
       "$id":ObjectId("5fcda6d086463b86f2650f79")
      }
}

DBRef的查詢

var user=db.hjy.findOne({"name":"hjy"})
var add=user.address
db[add.$ref].findOne({"_id":add.$id})