我有一个收藏"其中包含对另一个名为"章节"的集合中嵌套的问题数组中的问题索引的引用。
我想出了一个聚合,它工作得很好,但我想知道是否有机会:
- $lookup,限制为1,这样我们就不需要添加另一个聚合阶段来获取"第一";项,
- 将最后3个阶段合并(减少阶段数量),其中我"选择";通过索引从问题数组中找到特定的问题,然后将其投影到字段"question"中,并排除"question"。场。
- 我想知道减少聚合阶段的数量是否有任何性能上的好处。我不知道为什么我想要减少或组合阶段,但感觉它应该提高性能或至少更优雅?
Mongo Playground link
聚合管道如下:
[
{
$lookup: {
from: "chapters",
let: {
chapter_id: "$chapter"
},
pipeline: [
{
$match: {
$expr: {
$eq: [
"$_id",
"$$chapter_id"
]
}
}
},
{
$project: {
_id: 1,
name: 1,
questions: 1,
},
},
],
as: "chapter",
},
},
{
$addFields: {
chapter: {
$first: "$chapter",
},
},
},
{
$addFields: {
question: {
$arrayElemAt: [
"$chapter.questions",
"$question"
],
},
},
},
{
$project: {
"chapter.questions": 0,
},
},
]
这有帮助吗https://mongoplayground.net/p/QEGIFNvisNy?
我通过将limit stage传递给1来减少查找以只限制一条记录。此外,我们需要在查找之后展开(尽管在您的示例中总是有一个匹配的文档),然后不需要first,因为我们只有一个匹配的文档。其余阶段基本相同。