如果不知道子文档的具体名称,如何从MongoDB中取消设置子文档?
换句话说,我想基于其字段的某个或另一个值来识别子文档...但是,子文档的实际名称是未知的。所以我想以某种方式识别这个子文档,然后将其删除。
例如,在我将高度字段与160匹配的情况下,我想删除'baboon'子文档......
{ Document: {
monkey: {
height: 100,
weight: 40
},
baboon: {
height: 160,
weight: 70
}
}
我意识到数组是另一种选择($ placeholders和$ pull运算符),但我试图避免,因为这会在其他地方引入其他复杂性。
答案 0 :(得分:1)
如果使用mongodb v2.6,则需要使用$redact管道运算符。除非是生产环境,否则我强烈建议您将mongodb版本升级到最新版本,以享受mongodb运营商的全部功能。
这可能是$redact
阶段运算符的最简单用例。
height
的属性,
我们为它分配一个空值,以便我们可以保留该文档
遍历其子文件。代码:
db.collection.aggregate([
{$redact:{$cond:
[{$eq:[{$ifNull:["$height",""]},160]},
"$$PRUNE",
"$$DESCEND"
]
}
}
])
O / P:
{
"_id" : ObjectId("54931b403e20905cb605a802"),
"monkey" : {
"height" : 100,
"weight" : 40
}
}
一旦获得包含编辑信息的文档,您就可以对文档进行原子更新:
db.collection.aggregate([
{$redact:{$cond:
[{$eq:[{$ifNull:["$height",""]},160]},
"$$PRUNE",
"$$DESCEND"
]
}
}
]).forEach(function(doc){
db.collection.update({"_id":doc._id},doc)
})