在更新选择器中使用$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数组中的任何字符串匹配,并增加该文档的计数字段。如果mywords中没有等于某个字符串的文档名称字段,请创建一个文档{name:"stringFrom_mywords",计数:1}。
我想做的事情可能吗?我如何才能实现我想要的行为?我觉得使用forEach和单独更新是低效的。如果你觉得这些信息有用的话,我碰巧正在使用node.js MongoDb驱动程序。我知道我的问题类似于这个ruby问题,用MongoDb Upsert Multiple Records
虽然您可以使用upstart和multi标志运行更新,但它不会产生您想要的效果。您将需要运行三个单独的upstart命令,就像您对forEach示例所做的那样。
如果您想将此功能添加到MongoDB的未来版本中,请随时在SERVER项目中打开Jira票证。
- 使用promise和mongoose对文档进行排序
- document.open/document.write没有正确地清除chrome中的文档——这是chrome的错误吗
- Ajax请求文档就绪会导致jquery加载缓慢
- MongoDB (php) - 以数组而不是多个属性的形式返回文档属性
- 谷歌文档表面引擎
- 来自文档或下一个静态父级的事件委派
- 如何将childNodes用于XML文档
- 文档就绪提供了错误的选择器高度
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 未捕获的语法错误:无法在“文档”上执行“查询选择器”
- BrowserId登录请求在文档加载时被调用
- 从Javascript和Php变量创建Html模板文档
- 如何通过谷歌应用程序脚本从谷歌文档中的位置确定命名范围
- 在jquery文档准备好之前加载Modernizr
- 如何判断何时将dom节点添加到文档中
- 无法获取文档.GetElementById工作正常
- 在更新选择器中使用$in时颠倒多个文档
- 如何在mongodb中查询id存储在$in的“var-ids”数组中的文档
- 单词“in”是什么意思?在文档中的方法参数列表中
- 美元(文档).ready don't loading in IE