4

我正在编写一个程序,它将采用一个字符串数组,例如

var mywords = ["cat", "dog", "fish"] 

并将它们插入到 MongoDb 集合(称为“单词”集合)中。我想记录每个单词被插入集合的次数。有可能有些词已经在集合中,而有些则没有。

这有效:

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", count:1}。

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

4

1 回答 1

1

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

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

于 2012-07-25T19:41:03.403 回答