mongodb删除嵌套对象,不知道对象节点

时间:2015-11-23 13:31:59

标签: mongodb mongodb-query

对于以下文档,我试图删除包含id = 123

的节点
 {
       '_id': "1234567890",
        "image" : {
            "unknown-node-1" : {
                "id" : 123
            },
            "unknown-node-2" : {
                "id" : 124
            }
        }
    }

结果应如下所示。

{
    '_id': "1234567890",
    "image" : {        
        "unknown-node-2" : {
            "id" : 124
        }
    }
}

以下查询实现了结果。但我必须提前知道未知节点1。如何在不预先了解节点的情况下实现结果,但仅限于此 我拥有的信息是图片。*。id = 123

(*表示未知节点)

mongo有可能吗?或者我应该在我的应用代码上找到这些。

db.test.update({'_id': "1234567890"}, {$unset: {'image.unknown-node-1': ""}})

1 个答案:

答案 0 :(得分:3)

法伊兹,

没有操作员可以在不知道密钥的情况下帮助匹配和投影单个键值对。您必须编写后处理代码来扫描每个文档以找到具有id的节点,然后执行删除。

如果您可以自由更改架构,那么您将拥有更多的灵活性。使用这样的文档设计:

 {
       '_id': "1234567890",
        "image" : [
            {"id" : 123, "name":"unknown-node-1"},
            {"id" : 124, "name":"unknown-node-2"},
            {"id" : 125, "name":"unknown-node-3"}
        ]
  }

您可以从数组中删除文档:

db.collectionName.update(
  {'_id': "1234567890"},
  { $pull: { image: { id: 123} } }
)

这将导致:

{
    '_id': "1234567890",
    "image" : [
            {"id" : 124, "name":"unknown-node-2"},
            {"id" : 125, "name":"unknown-node-3"}
        ]
}