具有多个实例的mongoose $ in array

时间:2016-02-19 08:44:15

标签: node.js mongodb mongoose

我有一个postIds数组,可以多次使用postIdpostIds。现在我必须更新每个帖子,并且更新查询必须被触发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和触发更新都不是我想要的理想解决方案。

3 个答案:

答案 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 );