我需要從MongoDB中不同集合中的兩個文檔(其中1個公共字段,不更改數據庫)中獲取數據。我是一個新手,請幫助我與此在MongoDB中合併2個文檔
a = db.users.find(username:'[email protected]')
b = db.tasks.find(username:'[email protected]')
如何獲得一個變量c有a和b合併?
請幫忙。這可能是微不足道的,但幫助我。
我需要從MongoDB中不同集合中的兩個文檔(其中1個公共字段,不更改數據庫)中獲取數據。我是一個新手,請幫助我與此在MongoDB中合併2個文檔
a = db.users.find(username:'[email protected]')
b = db.tasks.find(username:'[email protected]')
如何獲得一個變量c有a和b合併?
請幫忙。這可能是微不足道的,但幫助我。
對於數據聚合,您最好熟悉MongoDB的map/reduce功能。 你可以閱讀更多關於它here。
一旦找出它,編寫Map(檢索數據)和Reduce(聚合數據)函數並不困難。
您可以在BSON Api中使用merge()
method。它會給你b與a結合並將結果存儲在b中。在做這件事之前,你可能想複製b中的b。
您將不得不在您的應用程序中執行此操作。不必擔心必須運行兩個查詢,因爲它不一定比運行一個複雜的查詢慢。
不應該總是採取更簡單的方式。從長遠來看,他可能遇到性能問題,然後可能不那麼容易地減少執行多個查詢所增加的開銷。 –
也許,但使用地圖縮小這是工程。 – Derick
當然,也許:)。 –
嘿,如果用戶在這兩個集合中都是唯一的,使用函數findOne(),因爲find()返回一個遊標。因此,要實現MongoDB的兩個對象的合併控制檯,您可以用波紋管代碼:
function mergeObjects(a,b) {
res = new Object();
for (attr in a)
res[attr] = a[attr];
for (attr in b)
res[attr] = b[attr];
// only if you wanna save it in a document again
delete res["_id"];
return res;
}
a = db.users.findOne({"username" : '[email protected]'})
b = db.tasks.findOne({"username" : '[email protected]'})
c = mergeObjects(a,b)
希望這解決您的問題。
我知道它可能不是你的情況,但如果你使用clojure,一個優雅的解決方案是在從mongo中檢索文檔後使用merge-with
函數。
(def a {
:scA {:a [1, 2]}
:scB {:b [3, 4]}
})
; {:scA {:a [1 2]}, :scB {:b [3 4]}}
(def b {
:scA {:c [5, 6]}
:scC {:d [7, 8]}
})
; {:scA {:c [5 6]}, :scC {:d [7 8]}}
(merge-with into a b)
; {:scA {:a [1 2], :c [5 6]}, :scB {:b [3 4]}, :scC {:d [7 8]}}
你能否澄清單詞「合併」?這聽起來像你想要加入。 –