MongoDB:在数组中取消设置嵌套字段

xienkqul  于 2023-06-22  发布在  Go
关注(0)|答案(1)|浏览(124)

我在MongoDB中有这样的文档:

{
    "parserErgebnis": [
      {
        "values": {
          "prop1": {
            "status": "OK",
            "wert": "03.00"
          },
          "prop2": {
            "status": "OK",
            "wert": "1"
          }
        }
      },
      {
        "values": {
          "prop1": {
            "status": "OK",
            "wert": "03.00"
          },
          "prop5": {
            "status": "OK",
            "wert": "1"
          }
        }
      }
    ]
  }

我想取消设置所有字段的“状态”。我知道某个状态的unset看起来像这样:

db.collection.update({},
{
  $unset: {
    "parserErgebnis.$[].values.prop1.status": 1
  }
},
{
  multi: true
})

然而,我想一次性删除所有的“状态”字段(甚至不知道 prop 基本上是如何命名的)。我基本上需要一种通配符机制,就像这样(PSEUDOCODE NOT WORKING):

db.collection.update({},
{
  $unset: {
    "parserErgebnis.$[].values.*.status": 1
  }
},
{
  multi: true
})

有没有一种方法可以让它工作,或者有没有一种替代方法?谢谢你的帮助

jm81lzqq

jm81lzqq1#

没有直接的方法可以从动态属性中删除属性,但是可以从MongoDB 4.2开始使用update with aggregation pipeline

  • $map迭代parserErgebnis数组的循环
  • $objectToArrayvalues对象转换为键值(k-v)格式的数组
  • $map迭代上面转换的(k-v)数组的循环,并按原样返回kv值不包括status属性
  • $arrayToObject将值转换回对象
  • $mergeObjects合并当前对象和新更新的values对象
db.collection.update({},
[
  {
    $set: {
      parserErgebnis: {
        $map: {
          input: "$parserErgebnis",
          in: {
            $mergeObjects: [
              "$$this",
              {
                values: {
                  $arrayToObject: {
                    $map: {
                      input: { $objectToArray: "$$this.values" },
                      in: {
                        k: "$$this.k",
                        v: {
                          wert: "$$this.v.wert"
                        }
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      }
    }
  }
],
{ multi: true })

Playrgound
update()方法折旧,您可以使用updateMany()方法.

相关问题