【问题标题】:Mongo Update key nested in array if exists嵌套在数组中的MongoDB更新键(如果存在)
【发布时间】:2021-11-19 12:12:19
【问题描述】:

我有类似的结构。在每个级别中都有一个"changed" 键,其中可以存在或不存在嵌套值是递归的数组。

{
"id" : 1,
"changed" : false,
"level_2" : [ 
    {
        "changed" : false
    }, 
    {
        "changed" : false,
        "level_3" : [ 
            {
                "changed" : false
            }, 
            {
                "changed" : false,
                "level_4" : [ 
                    {
                        "changed" : false
                    }
                ]
            }
        ]
    }
  ]
}

我必须将所有更改的密钥更新为true

我试过了

db.getCollection.update(
{ "id": 1 }, 
{ "$set": { "changed": true, 
    "level_2.$[].changed": true, 
    "level_2.$[].level_3.$[].changed": true,  
    "level_2.$[].level_3.$[].level_4.$[].changed": true} }
)

但它会抛出The path 'level_2.0.level_3' must exist in the document in order to apply array updates.

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    您需要arrayFilters 来检查是否存在level_3 和/或level_4(通过$exists)。如果是,则处理以更新 level_3 和/或 level_4 的嵌套数组字段。

    db.collection.update({
      "id": 1
    },
    {
      "$set": {
        "changed": true,
        "level_2.$[].changed": true,
        "level_2.$[levelThree].level_3.$[].changed": true,
        "level_2.$[levelThree].level_3.$[levelFour].level_4.$[].changed": true
      }
    },
    {
      arrayFilters: [
        {
          "levelThree.level_3": {
            $exists: true
          }
        },
        {
          "levelFour.level_4": {
            $exists: true
          }
        }
      ]
    })
    

    Sample Mongo Playground

    【讨论】:

      猜你喜欢
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多