【问题标题】:mongoose Update with $in is not working properlymongoose 使用 $in 更新无法正常工作
【发布时间】:2016-01-27 18:07:09
【问题描述】:

我的 JS 中有以下猫鼬更新:

var ids=[1,3];
restid=1;
db.model('rests').update({ _id: restid,'menu.id': {$in: ids}}, {$inc: {'menu.$.soldCounter': 1}}, {multi: true},function(err) {
    if(err)
        console.log("Error while updating sold counters: " + err.message);
});

由于某种原因,正在使用_id=1rest 文档进行更新,但仅在menu.1.soldCounter 上而不是menu.3.soldCounter 上进行更新

我已经测试了几次,结论是只有ids数组中的第一个ID会被更新。

有人能发现问题吗?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    这是因为 $ 运算符充当第一个匹配元素的占位符,在指南中说明:https://docs.mongodb.org/v2.6/reference/operator/update/positional/

    目前无法在单个运算符中更新所有子文档字段。这里是关于这个函数请求的讨论:https://jira.mongodb.org/browse/SERVER-1243

    【讨论】:

      【解决方案2】:

      其实有办法做到的:

          var indexes = [1,2,3];
      
          var update = { $inc: {} };
          for (var i = 0; i < indexes.length; ++i) {
             update.$inc[`menu.${indexes[i]}.soldCounter`] = 1;
      
          }
          db.model('rests').update({ _id: rest._id }, update, function(err) {
              if(err)
                  console.log("Error while updating sold counters: " + err.message);
          });
      

      您需要提前知道要更新的索引。那么它只需要一次调用数据库。

      【讨论】:

        猜你喜欢
        • 2018-04-26
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2017-08-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多