MongoDB 查询:如果对象中的任何嵌套对象具有键值,则删除条目

MongoDB query: delete entry if any nested object within object has value for key

假设我有以下条目:

{
  name: 'Bob',
  a: {
    02910143: { val: 10 },
    101B70BB: { val: 20 },
    7A6C86F1: { val: 10 },
  }
}

请注意,对象 a 的键是散列,所以我不知道它们的名称用于我的查询。我正在尝试编写我的查询,该查询将删除 val 为 10 的所有条目。我有以下内容,但我似乎无法弄清楚如何遍历所有嵌套对象:

db.collection('myCollection').deleteMany({ 'a.$.val': 10 })

如何让它检查 a 中的任何键值条目?

可以先用$arrayToObjecta转成k-v元组数组。然后使用 $filter 删除不等于 10 的值。最后使用 $arrayToObject

转换回原始形式
db.collection.aggregate([
  {
    "$addFields": {
      "a": {
        "$objectToArray": "$a"
      }
    }
  },
  {
    "$addFields": {
      "a": {
        "$filter": {
          "input": "$a",
          "as": "a",
          "cond": {
            $ne: [
              "$$a.v.val",
              10
            ]
          }
        }
      }
    }
  },
  {
    "$addFields": {
      "a": {
        "$arrayToObject": "$a"
      }
    }
  }
])

这里是Mongo playground供您参考。