【发布时间】:2021-07-16 12:41:24
【问题描述】:
我有以下文档结构(它是一个小型 LMS):
[
{
"name": "course1",
"code": "C1",
"levels": [
{
"levelname": "level01",
"order": 1,
"modules": [
{
"modulename": "title module 01",
"code": "MC1_01",
"order": 1,
"title": "module title 01"
},
{
"modulename": "title module 02",
"code": "MC1_02",
"order": 2,
"title": "module title 02"
}
]
},
{
"levelname": "level02",
"modules": [
{
"modulename": "title module 11",
"code": "MC1_11",
"order": 1,
"title": "module title 01"
},
{
"modulename": "title module 12",
"code": "MC1_12",
"order": 2,
"title": "module title 02"
}
]
}
]
},
{
"name": "course2",
"code": "C2",
"levels": [
{
"levelname": "level01",
"order": 1,
"modules": [
{
"modulename": "title module 01",
"code": "MC2_01",
"order": 1,
"title": "module title 01"
},
{
"modulename": "title module 02",
"code": "MC2_02",
"order": 2,
"title": "module title 02"
}
]
},
{
"levelname": "level02",
"modules": [
{
"modulename": "title module 10",
"code": "MC2_10",
"order": 1,
"title": "module title 01"
},
{
"modulename": "title module 11",
"code": "MC2_11",
"order": 2,
"title": "module title 02"
}
]
}
]
}
]
简而言之,我有一个包含所有课程的文档,一个课程由多个级别组成,每个级别都有许多模块:COURSE > LEVELS > MODULES
(这里有一个现成的游乐场:https://mongoplayground.net/p/Yo3OJQEQxf5)
知道代码或_id,我必须提取一个单一的模式,但我还必须保持文档的结构不变,还要保持父文档的属性。 我的预期输出是(当我查找代码为 MC1_02 的模块时):
{
"name": "course1",
"code": "C1",
"levels": [
{
"levelname": "level01",
"order": 1,
"modules": [
{
"modulename": "title module 02",
"code": "MC1_02",
"order": 2,
"title": "module title 02"
}
]
}
]
}
我正在尝试几次,并且已经尝试使用这些答案中突出显示的解决方案:
Mongo db Query to filter nested array of objects in document
MongoDB nested array search using $map
$filter upto 3 nested level in mongodb
我确切地知道如何使用 $unwind 和 $group 来做到这一点,但对我来说这不是最好的解决方案,我更喜欢使用 $map 和 $filter。 同时,我不能使用 $project 或任何其他聚合运算符来强制我逐个枚举所有属性,因为在任何级别都有大量不同的属性,我无法列出它们,我只是需要保留所有。
万分感谢那些帮助我的人:)
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework