【问题标题】:mongodb - how to insert a new key/value on each array's element if not present (with mongo query)mongodb - 如果不存在,如何在每个数组的元素上插入新的键/值(使用 mongo 查询)
【发布时间】:2021-07-22 19:04:10
【问题描述】:

我想更新公司数组中的每个元素(对象)。

这是我的实际数据:

{
  _id: ObjectId("60d31024860ce0400b586111")
  contracts: 
   [
     {
       name: 1.pdf
       url: "https://someurl"
       createdAt: 2021-06-23T10:42:44.594+00:00
     }
     {
       name: 2.pdf
       url: "https://someurl"
     }
     {
       name: 3.pdf
       url: "https://someurl"
     }
   ]
}

我想为每个没有“updatedAt”键的对象(在合同中)添加一个定义的日期。

这是我尝试过的:

db.companies.update({ _id: ObjectId("60d31024860ce0400b586111"),"contracts.createdAt": { $exists: false } },{ $set: { "contracts.$.createdAt": "test" } })

但我收到了这个错误: "位置运算符没有从查询中找到所需的匹配项。"

我也试过这个,它有效,但我不想按文件名查询。我只想在没有“createdAt”的每个元素上添加“createdAt”

db.companies.update({ "contracts.name": "2.pdf" },{ $set: { "contracts.$.createdAt": "atest" } })

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    我认为你需要使用filtered position operator:

    $ - 更新第一个匹配的数组元素 $[] - 使用特定条件更新所有匹配的元素

    arrayFilters键中提到了具体条件。

    
    db.students.update(
       { },
       { $set: { "contracts.$[element].createdAt" : "atest"} },
       { multi: true,
         arrayFilters: [ { "element.createdAt": { $exists: false } } ]
       }
    )
    
    

    multi - true 是对所有匹配的文档应用该操作。

    还要注意,第一个查询参数是如何为空的,这意味着查询针对所有文档运行。我根据您编写的第二个查询使用它,但您也可以在此处添加 ObjectID 查询。

    【讨论】:

    • 按预期工作。非常感谢!也感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2020-04-10
    相关资源
    最近更新 更多