mongodb - 如何从 MongoDB 文档中的双重嵌套数组中删除元素

我的文档结构类似于以下内容:

{
"_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 你有两个选择:

  1. 改变你的结构,以便你可以利用 $pull
  2. 不要使用 $pull。将整个对象加载到客户端并使用 findAndModify

https://stackoverflow.com/questions/5228210/

相关文章:

mongodb - Mongo按数组长度排序

mongodb - DynamoDB 相对于其他 NoSQL 数据库的优缺点是什么?

mongodb - 与 Mongos 连接时 system.profile 集合中缺少用户字段

mongodb - 在 mongo 中创建 super 用户

mongodb - 从现有 MongoDB 条目中删除键/值

mongodb - 自动压缩mongodb中删除的空间?

mongodb - 如何将 Robomongo 连接到 MongoDB

arrays - 从 mongodb 数组中的所有元素中删除一个字段

spring - 使用 MongoDB hibernate

mongodb - 何时在 MongoDB 集合上调用 ensureIndex?