我有一个postIds
数组,可以多次使用postId
个postIds
。现在我必须更新每个帖子,并且更新查询必须被触发models.Post.update({_id:{$in:postIds}},
{$inc : {'meta.comments' : -1}},
{multi:true}, function(err, doc){
if(err) {
console.log(err);
}
next();
});
数组中出现的次数。我使用的代码如下:
[1,2,3,1,2,4,1,1,4]
这会更新帖子,但只会更新一次。
更清楚地说,如果我的postIds数组是postId = 1
。我的目的是4
更新Set-Cookie
次,而不仅仅是我的代码正在发生的一次。我怎么能这样做?
PS:每次迭代postIds和触发更新都不是我想要的理想解决方案。
答案 0 :(得分:0)
也许你可以试试这段代码:
models.Post.find({_id:{$in:postIds}}, function(err, elements){
elements.forEach(function(value){
value['postIds'].forEach(function(postId){
if(postId === 1){
value['meta.comments'].$inc();
}
});
value.save();
})
});
您可以阅读此文档:http://mongoosejs.com/docs/2.7.x/docs/updating-documents.html
答案 1 :(得分:0)
事实是,如果我们考虑核心库MongoDB,它会将数组中的值传播到OR转换中。例如,对于您的数组,它将是:
1 or 2 or 3 or 1 ...
这意味着每个案例只会发生一次。此时,阵列没有详细的批量操作,由于在阵列上进行操作的复杂性,只有可用的阵列非常通用。
当然,您正在寻找一种一致的更新方法,只需要将最少数量的命令发送到数据库。不幸的是,此时此刻,您应该尝试为它设计自己的代码行,而不是查看mongoose。
好吧,您可以通过执行以下操作来减少呼叫:
1- call for [1,2,3,4] using -1 in $inc
2- call for [1,2,4] using -1 in $inc
3- call for [1] using -2 in $inc
或
1- call for [3] using -1 in $inc
2- call for [1,2,4] using -2 in $inc
3- call for [1] using -4 in $inc
答案 2 :(得分:-1)
如果您使用lodash,则只需
{_id: {$in: _.uniq(postIds)}
如果没有,你可以使用这样的东西
postIds.filter( (value, index, self) => self.indexOf(value) === index );