我有一个包含以下格式文档的集合:
{
tokens: {
name: {
value: "...",
},
...
}
}
name
可以是任何东西,并且可以有多个分配给不同键的嵌入式文档,所有这些文档都有一个value
字段。
如何$unset
所有具有特定value
的嵌入文档?{ $unset: { "tokens.value": "test" } }
不能工作,"tokens.$[].value"
和"tokens.$.value"
也不能。
可以使用流水线形式的更新,如下所示:
db.collection.update({},
[
{
"$set": {
"tokens": {
$arrayToObject: {
"$filter": {
"input": {
"$objectToArray": "$$ROOT.tokens"
},
"as": "item",
"cond": {
"$ne": [
"$$item.v.value",
"test"
]
}
}
}
}
}
}
],
{
multi: true
})
操场上链接。
在此查询中,我们执行以下操作:
- 使用
$objectToArray
将tokens
对象转换为数组。 - 我们使用
$filter
过滤掉嵌入文档中具有value
键且值为test
的数组元素。 最后,我们再次将过滤后的数组转换回object,并将其分配给
tokens
key。