首页 > 解决方案 > 如何使用 $pull 删除 mongodb 数组中的文档

问题描述

我有以下文档结构

{
    "_id" : ObjectId("5ffef283f1f06ff8524aa2c2"),
    "applicationName" : "TestApp",
    "pName" : "",
    "environments" : [],
    "stages" : [],
    "createdAt" : ISODate("2021-01-15T09:51:35.546Z"),
    "workflows" : [ 
        [ 
            {
                "pName" : "Test1",
                "wName" : "TestApp_Test1",
                "agent" : ""
            }, 
            {
                "pName" : "Test2",
                "wName" : "TestApp_Test2",
                "agent" : ""
            }
        ], 
        [ 
            {
                "pName" : "Test1",
                "wName" : "TestApp_Test1",
                "agent" : ""
            }
        ]
    ],
    "updatedAt" : Date(-62135596800000)
}

我希望删除

{
        "pName" : "Test1",
        "wName" : "TestApp_Test1",
        "agent" : ""
}

生成的文档应如下所示

{
        "_id" : ObjectId("5ffef283f1f06ff8524aa2c2"),
        "applicationName" : "TestApp",
        "pName" : "",
        "environments" : [],
        "stages" : [],
        "createdAt" : ISODate("2021-01-15T09:51:35.546Z"),
        "workflows" : [ 
            [ 
                {
                    "pName" : "Test2",
                    "wName" : "TestApp_Test2",
                    "agent" : ""
                }
            ]
        ],
        "updatedAt" : Date(-62135596800000)
    }

我已经尝试过以下 mongo 查询

db.getCollection('workflows').update({_id:ObjectId('5ffef283f1f06ff8524aa2c2')},
  {$pull:{workflows: { $elemMatch: {pipelineName: 'Test1'}}}} )

这是从工作流字段中删除所有文档,包括 Test2,因为 Test1 匹配。

我们如何才能只删除 Test1 的条目并保留其他条目?

标签: arraysmongodb

解决方案


您可以使用位置运算符 "$[]" 来做到这一点:

db.getCollection('workflows').update({_id: ObjectId("5ffef283f1f06ff8524aa2c2")  }, {$pull: {"workflows.$[]":{pName:"Test1"  } }  } )

但是架构看起来有点奇怪,如果在子数组中删除了所有元素,则更新后您将在工作流中拥有空数组。要修复空子数组,您需要执行第二个操作来删除它们:

db.getCollection('workflows').update({_id: ObjectId("5ffef283f1f06ff8524aa2c2")  }, {$pull: {"workflows":[]  } }   )

推荐阅读