【问题标题】:mongoose $in array with multiple instances具有多个实例的 mongoose $in 数组
【发布时间】:2016-02-19 17:31:08
【问题描述】:

我有一个postIds 数组,它可以有相同的postId 多次。现在我必须更新每个帖子,并且更新查询的触发次数必须与它在 postIds 数组中出现的次数一样多。我正在使用如下代码:

models.Post.update({_id:{$in:postIds}}, 
                   {$inc : {'meta.comments' : -1}}, 
                   {multi:true}, function(err, doc){
                     if(err) {
                           console.log(err);
                     }
                   next();
  });

这会更新帖子,但只会更新一次。

更清楚地说,如果我的 postIds 数组是 [1,2,3,1,2,4,1,1,4]。我的意图是 postId = 1 更新 4times 而不是现在我的代码正在发生的一次。我该怎么做?

PS:每次迭代 postIds 并触发更新并不是我正在寻找的理想解决方案。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    事实上,如果我们考虑核心库 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】:

    也许你可以试试这个代码:

      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

    【讨论】:

    • 类似的解决方案也无法解决问题,如果有多个 postId 实例,并且您确实找到(),回调中的“元素”仍然只有一次该帖子,因此元.cmets 只会为该 postId 增加一次
    【解决方案3】:

    如果你使用lodash,那么简单

    {_id: {$in: _.uniq(postIds)}
    

    如果没有,你可以使用类似的东西

    postIds.filter( (value, index, self) => self.indexOf(value) === index );
    

    【讨论】:

    • 那不是问题。我不想要独特的帖子。我宁愿希望它有多个实例并多次更新它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多