![](/img/trans.png)
[英]Is there a way to update or set fields like upsert does for documents?
[英]Upsert Multiple Documents while using $in in the update selector
我正在編寫一個過程,它將采用一系列字符串,如
var mywords = ["cat", "dog", "fish"]
並將它們插入MongoDb集合(稱為'words'集合)。 我想要計算每個單詞插入集合的次數。 有些單詞可能已經在集合中,有些則不是。
這有效:
var my_func = function(mywords) {
//Get connection to db...
mywords.forEach(function(word) {
collection.update({name: word}, {$inc: {count: 1}}, {upsert: true});
});
}
真棒。 所以現在如果{name:dog,count:3}是集合中唯一的文檔,我運行my_func([“cat”,“dog”,“fish”]),那么該集合現在將包含:
{name: dog, count: 4, _id: blah}
{name: cat, count: 1, _id: blah}
{name: fish, count: 1, _id: blah}
這正是我想要的,除了我想在一次更新中完成所有這些,即。 不在forEach中。 我試過這個:
var broken_func = function(mywords) {
//Get connection to db...
collection.update({name: {$in : {mywords}}, {$inc: {count: 1}}, {upsert: true, multi:true});
}
但是,如果我從同一個集合開始,它只包含{name:dog,count:3}並運行my_func([“cat”,“dog”,“fish”]),我的集合如下所示:
{name: dog, count: 3}
{count: 1}
我希望MongoDb將文檔的名稱字段與mywords數組中的任何字符串相匹配,並遞增該文檔的count字段。 如果沒有文檔名稱字段等於mywords中的某個字符串,請創建一個文檔{name:“stringFrom_mywords”,count:1}。
我想做的是什么,我怎樣才能實現我想要的行為? 我覺得使用forEach並進行單獨更新效率很低。 如果您發現該信息有用,我碰巧使用node.js MongoDb驅動程序。 我知道我的問題類似於這個紅寶石問題用MongoDb Upsert Multiple Records
雖然您可以使用upsert和multi標志運行更新,但它不會產生您想要的效果。 您需要運行三個單獨的upsert命令,就像使用forEach示例一樣。
如果您希望將此功能添加到MongoDB的未來版本中,請隨意在SERVER項目中打開Jira票證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.