【发布时间】:2021-08-22 06:12:34
【问题描述】:
在我的集合中,我有两个嵌套的子文档,分别称为“级别”和“模块”:
[
{
"_id": 1,
"course": "course1",
"levels": [
{
"level_id": "C1L1",
"name": "course 1 - level1",
"modules": [
{
"module_id": "C1L1M1",
"name": "level 1module1"
},
{
"module_id": "C1L1M2",
"name": "level 1 module2"
},
]
},
{
"level_id": "C1L2",
"name": "course 1 - level2",
"modules": [
{
"module_id": "C1L2M1",
"name": "level 2 module1"
},
{
"module_id": "C1L1M2",
"name": "level 2 module2"
},
]
},
]
},
{
"_id": 2,
"course": "course2",
"levels": [
{
"level_id": "C2L1",
"name": "course 2 - level1",
"modules": [
{
"module_id": "C2L1M1",
"name": "level1 module1"
},
{
"module_id": "C2L1M2",
"name": "level1 module2"
},
]
},
{
"level_id": "C2L2",
"name": "course 2 - level2",
"modules": [
{
"module_id": "C2L2M1",
"name": "level 2 module1"
},
{
"module_id": "C2L1M2",
"name": "level 2 module2"
},
]
},
]
},
]
我只需要获取一个符合条件的子文档,例如 {"module_id": "C1L2M1"} 。
我已经确切知道如何使用聚合框架来实现这一点,但我想知道是否有任何解决方案可以避免聚合。
我只能在投影中使用$elemMatch 检索一个嵌套子文档,但我不知道如何过滤第二个嵌套子文档(在我的示例中为模块)。
我想要的结果是查询模块“C1L2M1”并且只得到这个:
{
"module_id": "C1L2M1",
"name": "level 2 module1"
}
这里是一个示例游乐场:https://mongoplayground.net/p/uwBOh1MkQm-
【问题讨论】:
-
我想知道是否有任何避免聚合的解决方案 => 不,没有聚合过滤器运算符是不可能的,您可以在从 MongoDB 开始的查找投影中使用聚合投影运算符4.4.像 $map/$filter..
-
这就是我教的。 >= 4.4 是可能的吧?
-
@turivishal 谢谢,你知道在 find 投影中使用聚合运算符在性能方面是更快还是更慢(或相等:))?
-
我认为两者是相等的,他们在documentation 中没有提到,如果你想确保 100% 然后在两个查询中通过 .explain() 检查性能。
-
@turivishal 非常感谢。您要发布答案以便我接受它是正确的吗?
标签: mongodb mongodb-query