我有以下类型的文件:
[
{
"_id": ObjectId("5c05984246a0201286d4b57a"),
f: "x",
"_a": [
{
"_onlineStore": {}
},
{
"_p": {
"s": {
"a": {
"t": [
{
id: 1,
"dateP": "20200-09-20",
did: "x",
dst: "y",
den: "z"
},
{
id: 2,
"dateP": "20200-09-20"
}
]
},
"c": {
"t": [
{
id: 3,
"dateP": "20300-09-22",
},
{
id: 4,
"dateP": "20300-09-23",
did: "x",
dst: "y",
den: "z"
},
{
id: 5,
"dateP": "20300-09-23",
}
]
}
}
}
}
]
}
]
我需要找到删除所有没有“did”、“dst”和“den”字段的文档的更新查询,在上面的文档嵌套数组中是 id:[2,3,5] 的子对象,在真实的集合中我不知道id,是否有选项可以一次性删除所有内容?
更新后的文档需要如下所示:
[
{
"_id": ObjectId("5c05984246a0201286d4b57a"),
f: "x",
"_a": [
{
"_onlineStore": {}
},
{
"_p": {
"s": {
"a": {
"t": [
{
id: 1,
"dateP": "20200-09-20",
did: "x",
dst: "y",
den: "z"
}
]
},
"c": {
"t": [
{
id: 4,
"dateP": "20300-09-23",
did: "x",
dst: "y",
den: "z"
}
]
}
}
}
}
]
}
]
这是你想要的吗?:
db.collection.update(
{},
[
{
$set: {
"_a": {
$map: {
input: "$_a",
as: "external",
in: {
$cond: [
{
$gt: [
"$$external._p",
0
]
},
{
_p: {
s: {
a: {
t: {
$filter: {
input: "$$external._p.s.a.t",
as: "item",
cond: {
$and: [
{
$gt: [
"$$item.did",
0
]
},
{
$gt: [
"$$item.dst",
0
]
},
{
$gt: [
"$$item.den",
0
]
}
]
}
}
}
}
},
c: {
t: {
$filter: {
input: "$$external._p.s.c.t",
as: "item",
cond: {
$and: [
{
$gt: [
"$$item.did",
0
]
},
{
$gt: [
"$$item.dst",
0
]
},
{
$gt: [
"$$item.den",
0
]
}
]
}
}
}
}
}
},
"$$external"
]
}
}
}
}
}
],
{multi:true})
查看它在 playground 示例中的工作原理