簡體   English   中英

在更新選擇器中使用$ in時多個文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM