2017-09-25 50 views
0

我在工作中討論了1對N關係中的雙向引用。 According to this post in MongoDB blog,你可以做到。我們根本不需要原子更新,所以沒有問題。按照文章中的例子,在我們的例子中,您只能創建或刪除任務,但不能更改任務所有者。在Mongo中,雙向引用對於1對N關係更有效嗎?

我的論點是雙向的引用可能是從雙方讀取數據更有效,因爲我們需要他們的任務和較少只是任務往往顯示刷卡,在程序的不同部分。我的同事說不會有效率提高,數據重複也不值得。

你有關於這種方法的效率的任何信息?

回答

0

取消規範化和存儲數據有助於減少寫入和更多讀取操作。這裏效率取決於數據的檢索方式。如果我們從集合中檢索數據需要雙向引用,並且我們已經擁有它,那麼肯定會提高查​​詢的效率。

學生收集

{ _id:1, name: "Joseph", courses:[1, 3, 4]} 
{ _id:2, name: "Mary", courses:[1, 3]} 
{ _id:3, name: "Catherine", courses:[1, 2, 4]} 
{ _id:4, name: "Robert", courses:[2, 4]} 

場收集

{ _id:1, name: "Math101", students: [1, 2, 3]} 
{ _id:2, name: "Science101", students: [3, 4]} 
{ _id:3, name: "History101", students: [1, 2]} 
{ _id:4, name: "Astronomy101", students: [1, 3, 4]} 

考慮學生和課程上面的例子,這裏雙向引用完成後,課程數組中的學生集合給我們學生學習的不同課程。同樣,課程集合中的學生陣列爲我們提供了正在研究相應課程的學生。

如果我們要列出誰正在研究Math101學生那麼查詢將

db.courses.aggregate([{$match: {name:"Math101"}}, 
    {$unwind:"$students"}, 
    {$lookup:{from:"students", 
      localField:"students", 
      foreignField:"_id", 
      as:"result"}}]) 

$match$unwind$lookup在聚合管道來實現的結果。 $匹配來減少數據(在聚合流水線開始時使用此運算符是很好的做法),$展開展開Courses集合中的學生數組,$ $查找以查找學生集合並獲取學生詳細信息

在我們的樣本集合執行上述聚集查詢後的結果是

{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 1, 
     "result" : [ 
       { 
         "_id" : 1, 
         "name" : "Joseph", 
         "courses" : [ 
           1, 
           3, 
           4 
         ] 
       } 
     ] 
} 
{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 2, 
     "result" : [ 
       { 
         "_id" : 2, 
         "name" : "Mary", 
         "courses" : [ 
           1, 
           3 
         ] 
       } 
     ] 
} 
{ 
     "_id" : 1, 
     "name" : "Math101", 
     "students" : 3, 
     "result" : [ 
       { 
         "_id" : 3, 
         "name" : "Catherine", 
         "courses" : [ 
           1, 
           2, 
           4 
         ] 
       } 
     ] 
} 

對雙向效率引用純粹基於我們檢索,因此設計您的架構緊密地與您預期的結果一致。

相關問題