arrays - 如何使用 $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 的条目并保留其他条目?
解决方案
您可以使用位置运算符 "$[]" 来做到这一点:
db.getCollection('workflows').update({_id: ObjectId("5ffef283f1f06ff8524aa2c2") }, {$pull: {"workflows.$[]":{pName:"Test1" } } } )
但是架构看起来有点奇怪,如果在子数组中删除了所有元素,则更新后您将在工作流中拥有空数组。要修复空子数组,您需要执行第二个操作来删除它们:
db.getCollection('workflows').update({_id: ObjectId("5ffef283f1f06ff8524aa2c2") }, {$pull: {"workflows":[] } } )
推荐阅读
- android - Flutter 上的 Http 链接在 Android 设备上不起作用
- reactjs - 使用 formik 和 yup 进行对象验证
- java - org.hibernate.InstantiationException:没有实体的默认构造函数::io.javabrains.Image
- python - django 模板的 for 循环内容未显示
- javascript - ApexCharts 自定义标记颜色
- python - paramiko ssh 挂在 windows 机器上的 packet.py 中
- http - 如何理解`当您直接连接到端口 443 (https://IP:443) 上的 IP 时,会暴露 SSL 证书。`?
- linux - 如何在 Linux 中了解 OpenGL 版本并安装最新版本
- css - 如何在 css 样式标签中编写 django 代码以链接静态目录中的图像
- android - Android Studio文件上传问题(改造multipartbody)