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
中的任何键值条目?
可以先用$arrayToObject
把a
转成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供您参考。
假设我有以下条目:
{
name: 'Bob',
a: {
02910143: { val: 10 },
101B70BB: { val: 20 },
7A6C86F1: { val: 10 },
}
}
请注意,对象 a
的键是散列,所以我不知道它们的名称用于我的查询。我正在尝试编写我的查询,该查询将删除 val
为 10 的所有条目。我有以下内容,但我似乎无法弄清楚如何遍历所有嵌套对象:
db.collection('myCollection').deleteMany({ 'a.$.val': 10 })
如何让它检查 a
中的任何键值条目?
可以先用$arrayToObject
把a
转成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供您参考。