对于以下文档,我试图删除包含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': ""}})
答案 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"}
]
}