我需要过滤MongoDB中的多级嵌套数组。模式如下,
{
"_id": "1234",
"array1": [
{
"id": "a11",
"array2": [
{
"id": "a21",
"array3": [
{
"id": "a31",
"status": "done"
},
{
"id": "a32",
"status": "pending"
}
]
}
]
}
]
}所需的输出必须使用条件array3和条件status=done筛选。实现相同目标的最佳方法是哪一种?
发布于 2022-04-24 18:13:14
使用$map迭代array1和array2,使用$filter过滤array3。最后,将array3与空数组进行文档匹配比较。
db.collection.aggregate([
{
"$addFields": {
"array1": {
"$map": {
"input": "$array1",
"as": "a1",
"in": {
id: "$$a1.id",
array2: {
"$map": {
"input": "$$a1.array2",
"as": "a2",
"in": {
id: "$$a2.id",
array3: {
"$filter": {
"input": "$$a2.array3",
"as": "a3",
"cond": {
$eq: [
"$$a3.status",
"done"
]
}
}
}
}
}
}
}
}
}
}
},
{
$match: {
"array1.array2.array3": {
$ne: []
}
}
}
])这是供您参考的蒙戈游乐场。
发布于 2022-04-24 19:55:26
查询
$mergeObjects允许我们不手工编写字段(如果是mongoDB5+,也可以使用$setField)(如果您有10个字段代替id,这将在不更改查询的情况下工作)aggregate(
[{"$set":
{"array1":
{"$map":
{"input": "$array1",
"as": "a1",
"in":
{"$mergeObjects":
["$$a1",
{"array2":
{"$map":
{"input": "$$a1.array2",
"as": "a2",
"in":
{"$mergeObjects":
["$$a2",
{"array3":
{"$filter":
{"input": "$$a2.array3",
"as": "a3",
"cond": {"$eq": ["$$a3.status", "done"]}}}}]}}}}]}}}}}])https://stackoverflow.com/questions/71991025
复制相似问题