我在工作中討論了1對N關係中的雙向引用。 According to this post in MongoDB blog,你可以做到。我們根本不需要原子更新,所以沒有問題。按照文章中的例子,在我們的例子中,您只能創建或刪除任務,但不能更改任務所有者。在Mongo中,雙向引用對於1對N關係更有效嗎?
我的論點是雙向的引用可能是從雙方讀取數據更有效,因爲我們需要他們的任務和較少只是任務往往顯示刷卡,在程序的不同部分。我的同事說不會有效率提高,數據重複也不值得。
你有關於這種方法的效率的任何信息?
我在工作中討論了1對N關係中的雙向引用。 According to this post in MongoDB blog,你可以做到。我們根本不需要原子更新,所以沒有問題。按照文章中的例子,在我們的例子中,您只能創建或刪除任務,但不能更改任務所有者。在Mongo中,雙向引用對於1對N關係更有效嗎?
我的論點是雙向的引用可能是從雙方讀取數據更有效,因爲我們需要他們的任務和較少只是任務往往顯示刷卡,在程序的不同部分。我的同事說不會有效率提高,數據重複也不值得。
你有關於這種方法的效率的任何信息?
取消規範化和存儲數據有助於減少寫入和更多讀取操作。這裏效率取決於數據的檢索方式。如果我們從集合中檢索數據需要雙向引用,並且我們已經擁有它,那麼肯定會提高查詢的效率。
學生收集
{ _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
]
}
]
}
對雙向效率引用純粹基於我們檢索,因此設計您的架構緊密地與您預期的結果一致。