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

Upsert Multiple Documents while using $in in the update selector

本文关键字:文档 in 选择器 更新      更新时间:2024-03-16

我正在编写一个过程,该过程将接受一个字符串数组,如

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数组中的任何字符串匹配,并增加该文档的计数字段。如果mywords中没有等于某个字符串的文档名称字段,请创建一个文档{name:"stringFrom_mywords",计数:1}。

我想做的事情可能吗?我如何才能实现我想要的行为?我觉得使用forEach和单独更新是低效的。如果你觉得这些信息有用的话,我碰巧正在使用node.js MongoDb驱动程序。我知道我的问题类似于这个ruby问题,用MongoDb Upsert Multiple Records

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

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