我的文档结构类似于以下内容:
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
我想删除值为“delete me”的嵌套数组元素。
我知道我可以使用嵌套的 $elemMatch
表达式找到与此描述匹配的文档。删除相关元素的查询语法是什么?
最佳答案
要删除有问题的项目,您实际上将使用更新。更具体地说,您将使用 $pull
命令进行更新,该命令将从数组中删除项目。
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
这里发生了一点“魔法”。使用 .0
表示我们知道我们正在修改 someArray
的第 0 项。使用 {"name":"delete me"}
表示我们知道我们计划删除的确切数据。
如果您将数据加载到客户端然后执行更新,此过程就可以正常工作。如果您想要执行执行这些操作的“通用”查询,则此过程效果较差。
我认为最简单的方法是简单地认识到更新子文档数组通常需要您在某个时候在内存中拥有原始文档。
针对下面的第一条评论,您可能可以通过稍微改变数据结构来帮助您的情况
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
现在你可以做 {$pull : { "someObjects.name1.someNestedArray": ...
这是您的结构的问题。 MongoDB 对操作“子数组”没有很好的支持。您的结构有一个对象数组,而这些对象包含更多对象的数组。
如果你有以下结构,你将很难使用像 $pull
这样的东西:
array [
{ subarray : array [] },
{ subarray : array [] },
]
如果你的结构看起来像 并且 你想更新 subarray
你有两个选择:
$pull
。$pull
。将整个对象加载到客户端并使用 findAndModify
。https://stackoverflow.com/questions/5228210/