如果您不知道子文档名称,请从MongoDB中删除子文档

时间:2014-12-18 16:42:58

标签: mongodb

如果不知道子文档的具体名称,如何从MongoDB中取消设置子文档?

换句话说,我想基于其字段的某个或另一个值来识别子文档...但是,子文档的实际名称是未知的。所以我想以某种方式识别这个子文档,然后将其删除。

例如,在我将高度字段与160匹配的情况下,我想删除'baboon'子文档......

{ Document: {
    monkey: {
        height: 100,
        weight: 40
    },
    baboon: {
        height: 160,
        weight: 70
    }
}

我意识到数组是另一种选择($ placeholders和$ pull运算符),但我试图避免,因为这会在其他地方引入其他复杂性。

1 个答案:

答案 0 :(得分:1)

如果使用mongodb v2.6,则需要使用$redact管道运算符。除非是生产环境,否则我强烈建议您将mongodb版本升级到最新版本,以享受mongodb运营商的全部功能。

这可能是$redact阶段运算符的最简单用例。

  • 从根文档开始,检查文档是否具有属性 身高是160。
  • 如果文档的高度等于160,PRUNE它。其他 DESCEND查看其子文件。
  • 如果某个级别的文档没有名为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)
})