$lookup获取"first"并组合添加字段 + 排除字段



我有一个收藏"其中包含对另一个名为"章节"的集合中嵌套的问题数组中的问题索引的引用。

我想出了一个聚合,它工作得很好,但我想知道是否有机会:

  1. $lookup,限制为1,这样我们就不需要添加另一个聚合阶段来获取"第一";项,
  2. 将最后3个阶段合并(减少阶段数量),其中我"选择";通过索引从问题数组中找到特定的问题,然后将其投影到字段"question"中,并排除"question"。场。
  3. 我想知道减少聚合阶段的数量是否有任何性能上的好处。我不知道为什么我想要减少或组合阶段,但感觉它应该提高性能或至少更优雅?

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,因为我们只有一个匹配的文档。其余阶段基本相同。