在更新选择器中使用$ in时多个文档

时间:2012-07-25 18:53:25

标签: javascript node.js mongodb mongodb-query

我正在编写一个过程,它将采用一系列字符串,例如

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”])的集合开始,我的集合如下所示: / p>

{name: dog, count: 3}
{count: 1}

我希望MongoDb将文档的名称字段与mywords数组中的任何字符串相匹配,并递增该文档的count字段。如果没有文档名称字段等于mywords中的某个字符串,请创建一个文档{name:“stringFrom_mywords”,count:1}。

我想做的是什么,我怎样才能实现我想要的行为?我觉得使用forEach并进行单独更新效率很低。如果您发现该信息有用,我碰巧使用node.js MongoDb驱动程序。我知道我的问题类似于这个红宝石问题Upsert Multiple Records with MongoDb

1 个答案:

答案 0 :(得分:1)

虽然您可以使用upsert和multi标志运行更新,但它不会产生您想要的效果。您将需要运行三个单独的upsert命令,就像使用forEach示例一样。

如果您希望将此功能添加到MongoDB的未来版本中,请随时在SERVER项目中打开Jira票证。