【发布时间】:2016-03-25 00:36:39
【问题描述】:
我有一个 mongo 标签集合,当用户输入一个标签数组时,我想要执行以下操作:
如果数组中存在标签,则更新计数 如果数组中的标签不存在,则插入计数为0
我目前有:
QuestionTags.update({'tag': {$in: tagArray}}, {$inc : {'count': +1} }, { upsert: true });
QuestionTags 是 db 集合的猫鼬模式。
这似乎不起作用。我输入了一个新标签数组,它们没有被添加,现有标签也没有被增加。
有没有一种方法可以处理这个问题,而不必遍历 tagArray 并对数组中的每个项目进行 db 调用?
更新: 将我的代码更改为此
QuestionTags.update({'tag': {$in: req.body.tags}}, {$inc : {'count': +1} }, { upsert: true, multi: true });
QuestionTags.find({'tag' :{$nin: req.body.tags}}, function(err, newTags) {
console.log("New Tags :" + newTags);
var tagArray = [];
newTags.forEach(function(tag){
var tagObj = {
tag: tag,
count: 1
}
tagArray.push(tagObj);
});
QuestionTags.collection.insert(tagArray);
});
但是,newTags 为空。 QuestionTags 集合当前为空,因此不应为空。
【问题讨论】:
-
你的 tagArray 中有什么?简单的字符串?我刚刚做了一个测试,增量适用于您的更新查询。对于插入,您的更新对象(更新的第二个参数)中没有
$set: {tag: 'newTag'},因此 upsert 实际上并没有插入任何内容。 -
@Komo 是的,它只是简单的字符串 ["Java"、"JavaScript"、"Agile"]。如果其他一切正常,您可以发布一个正确的解决方案
-
@Komo 你发布的解决方案没有用吗?
-
很遗憾,不,我认为没有办法通过查询 mongo 来“过滤”数组而不做循环
-
我发布了一个新答案,希望适合你
标签: javascript node.js mongodb express mongoose