mongodb在不知道对象节点的情况下删除嵌套对象

标签 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
        }
    }
}

下面的查询实现了结果。但我必须提前知道 unknown-node-1。我怎样才能在没有节点预先知识的情况下获得结果,而只是 我拥有的信息是 image.*.id = 123

(*表示未知节点)

在 mongo 中可以吗?或者我应该在我的应用程序代码中找到这些。

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

最佳答案

费兹,

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

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

 {
       '_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"}
        ]
}

关于mongodb在不知道对象节点的情况下删除嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33872362/

相关文章:

mongodb - 环境变量 MONGODB_CONFIG_OVERRIDE_NOFORK == 1,覆盖\"processManagement.fork\"为 false”

javascript - 如何在 MongoDB 中累积结果(使用 forEach?)?

python - PyMongo 创建具有 2 个或更多字段的唯一索引

node.js - Mongoose:在 Model.remove() 中设置单个选项

Java MongoDB 类 NotFoundException : org. springframework.data.convert.CollectionFactory

Mongodb插入没有_id字段的文档

node.js - Mongoose findOne ObjectId 数组返回 null

mongodb - 仅当文档早于 MongoDB 中的新文档时,如何更新插入?

java - MongoDB(Java): efficient update of multiple documents to different(!)值

mongodb - MongoDB 中的游标是什么?