对于下面的文档,我试图删除包含 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/