【问题标题】:Mongo is it possible to increment array element if not present如果不存在,Mongo 是否可以增加数组元素
【发布时间】:2020-09-11 10:20:50
【问题描述】:

您好,我正在尝试递增数组中的一个元素,如下所示

{ "_id" : 1
  "myarray": [
    {"a": 1}
    {"b": 1}
    {"c": 1}
  ]
}

{ "_id" : 2
  "myarray": [
    {"a": 4}
    {"b": 7}
    {"c": 9}
  ]
}

db.mycollection({"_id": 1}, {"$inc": {"myarray.$.a"}});
db.mycollection({"_id": 2}, {"$inc": {"myarray.$.b"}});

我知道 mongo $ 运算符用于识别上述数组中的元素。

我要解决的问题是在某些情况下我的数据没有数组

{ "_id" : 3
}

{ "_id" : 4
}

如果我执行db.mycollection({"_id": 3}, {"$inc": {"myarray.$.a"}});,它不会使用 id 更新文档,因为 myarray 不存在文档。

所以我所做的直接修复是在我插入文档时将 myarray 初始化为零

{ "_id" : 3
  "myarray": [
    {"a": 0}
    {"b": 0}
    {"c": 0}
  ]
}
{ "_id" : 4
  "myarray": [
    {"a": 0}
    {"b": 0}
    {"c": 0}
  ]
}

有没有办法直接用零预初始化数组元素进行更新?

【问题讨论】:

    标签: arrays database mongodb mongodb-query


    【解决方案1】:

    db.mycollection({"_id": 1}, {"$inc": {"myarray.$.a"}}); 在很多方面都是错误的:

    • 首先是db.mycollection.update或updateOne、updateMany等

    • 接下来,$inc 需要一个关于您想要增加多少的数字。如果为 1,则必须明确指定:{"$inc": {"myarray.$.a": 1}}

    • 最后,您知道的$ 运算符需要来自查询部分的匹配项(update* 函数的第一个参数)。请阅读您在问题中所指的页面。

    要回答这个问题 - 不,没有这样的方法。这与$inc 无关——如果它不存在,它实际上会用 0 初始化一个字段。 $ 不会将新元素推送到数组中,因为文档不会通过您指定 $ 应该引用哪个匹配子文档的过滤器阶段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-12
      • 2021-08-05
      • 2019-05-09
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      相关资源
      最近更新 更多