要删除有问题的项目,实际上需要使用更新.更具体地说,您将使用$pull
命令进行更新,该命令将从数组中删除该项.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
这里发生了一点"魔法".使用.0
表示我们知道我们正在修改someArray
的第0项.使用{"name":"delete me"}
表示我们知道计划删除的确切数据.
如果将数据加载到客户机中,然后执行更新,这个过程就可以正常工作.如果要执行执行这些操作的"通用"查询,则此过程的效果较差.
我认为最简单的方法是简单地认识到,更新子文档数组通常需要在某个时刻将原始文档存储在内存中.
作为对下面第一条 comments 的回应,您可能可以通过稍微更改数据 struct 来帮助您的情况
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
现在你可以做{$pull : { "someObjects.name1.someNestedArray" : ...
你的 struct 有问题.MongoDB对操作"子数组"没有很好的支持.您的 struct 有一个对象数组,这些对象包含更多对象的array.
如果你有以下 struct ,你将很难使用$pull
这样的东西:
array [
{ subarray : array [] },
{ subarray : array [] },
]
如果你的 struct 看起来像and,你想更新subarray
,你有两个 Select :
- 改变你的 struct ,这样你就可以利用
$pull
.
- 不要用
$pull
.将整个对象加载到客户端并使用findAndModify
.