2014-01-07 95 views
0

假設我有MongoDB的兩個集合A和B,其中,A具有參考B的列表中的屬性:查找文檔MongoDB中有一組鍵

答:

{ 
    _id: ObjectId 
    name : String 
    itemB : [ObjectId]  
} 

B:

{ 
    _id: ObjectId 
    data : String 
    info : [String] 
} 

什麼會更好地得到所有B中的「數據」對於一個給定答:

一)讀出來自陣列itemB,做({_id:x})爲每個元素x

b)從A讀取數組itemB,陣列

或者還有更好的方法來建模? 將它分成A和B的原因是B.info可以有多個項目或B.data可以很長。這意味着將B嵌入到A可能會導致性能問題,因爲最大文檔大小。

回答

0

最好的辦法是存儲關係的 「其他方法」 圍繞:

答:

{ 
    _id: ObjectId 
    name : String 
} 

B:

{ 
    _id: ObjectId 
    data : String 
    info : [String] 
    itemA: ObjectId 
} 

那麼你可以簡單的查詢:

db.B.find({ itemA: … }); 

此問題RY將工作,如果意達是一個數組:

{ 
    _id: ObjectId 
    data : String 
    info : [String] 
    itemA: [ ObjectId, ObjectId, … ] 
} 

在MongoDB中你往往最終存儲在另一邊的「外鍵」相比,一個關係數據庫。

+0

我看到了這個動機。但是,就我而言,B不與單個A關聯,它可能是1:n或n:m關係。相反,A1有一個Bs列表,而A2有另一個Bs列表。在你的情況下,B也會被關聯到單個A? – Se7enDays

+0

是的,在我的例子中它的確如此。但是itemA也可以很容易地成爲一個數組,查詢仍然可以工作。 – Derick

+0

我已經添加到我的答案。 – Derick

相關問題