我正在编写一个程序,它将采用一个字符串数组,例如
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