我正在處理一個需要使用Mongo查詢的高效數據集。該應用程序使用Ford-Fulkerson算法來計算建議並以多項式時間運行,因此效率非常重要。語法是ES6,但一切基本相同。
這是我正在使用的數據的近似值。項目和一個項目的數組被匹配了對其他項目:
let items = ["pen", "marker", "crayon", "pencil"];
let match = "sharpie";
最後,我們將遍歷match
和1.因此增加了配對的權重,通過函數去後,我的理想數據看起來是這樣的:
{
sharpie: {
pen: 1,
marker: 1,
crayon: 1,
pencil: 1
}
}
爲了進一步詳細描述,旁邊的每個鍵的值是關係,這是說,這些項目已經配對在一起的次數的weight
。我想有發生的情況是這樣的:
// For each in the items array, check to see if the pairing already
// exists. If it does, increment. If it does not, create it.
_.each(items, function(item, i) {
Database.upsert({ match: { $exist: true }}, { match: { $inc: { item: 1 } } });
})
的問題,當然,是蒙戈不允許括號標記,也不允許變量名作爲關鍵字(match
)。據我所知,另一個問題是Mongo在嵌套深的$inc
運營商('The dollar ($) prefixed field \'$inc\' in \'3LhmpJMe9Es6r5HLs.$inc\' is not valid for storage.' }
)上也存在問題。
有什麼我可以做的儘可能少的查詢做到這一點?我接受建議。
編輯
我試圖創建對象,以傳遞到蒙戈查詢:
_.each(items, function(item, i) {
let selector = {};
selector[match] = {};
selector[match][item] = {};
let modifier = {};
modifier[match] = {};
modifier[match]["$inc"] = {};
modifier[match]["$inc"][item] = 1
Database.upsert(selector, modifier);
不幸的是,它仍然無法正常工作。 $inc
打破了查詢,它不會讓我超過1級深入任何改變。
解決方案
這是我最終實現的功能。它像一個魅力!謝謝馬特。
_.each(items, function(item, i) {
let incMod = {$inc:{}};
let matchMod = {$inc:{}};
matchMod.$inc[match] = 1;
incMod.$inc[item] = 1;
Database.upsert({node: item}, matchMod);
Database.upsert({node: match}, incMod);
});
由於不能直接在參數中使用變量,並且不支持括號表示法,所以必須在調用Mongo查詢之前編程創建查詢對象。 http://stackoverflow.com/questions/22331216/programmatically-updating-fields-in-mongo-and-meteor – fuzzybabybunny
@fuzzybabybunny謝謝你的回覆:)我試過使用查詢對象,但'$ inc'沒有出現深入發揮功能。有什麼想法嗎? – samcorcos
「邊緣」是什麼意思? Mongo中沒有'邊緣'操作符。另外,'modifier [「edge」] [「$ inc」] [item] = 1'沒有定義變量'item'。你的意思是'el'? – fuzzybabybunny