首页 > 解决方案 > $lookup get "first" 并结合 addField + exclude 字段

问题描述

我有一个集合“Notes”,其中包含对另一个名为“Chapters”的集合中嵌套问题数组中问题索引的引用。

我想出了一个工作正常的聚合,但我想知道是否有机会:

  1. $lookup 的限制为 1,因此我们不需要添加另一个聚合阶段只是为了从查找数组结果中获取“第一个”项,并且
  2. 结合最后 3 个阶段(减少阶段数),我通过索引从问题数组中“挑选”特定问题,然后将其投影到“问题”字段,并排除“问题”字段。
  3. 我想知道减少聚合阶段的数量是否有任何性能优势。我不知道为什么要减少或合并阶段,但感觉它应该提高性能或至少更优雅?

Mongo Playground 链接

聚合管道是这样的:

[
  {
    $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,
    },
  },
]

标签: mongodbmongodb-query

解决方案


这对https://mongoplayground.net/p/QEGIFNvisNy有帮助吗?

我通过将限制阶段传递给 1 来减少查找以仅限制一条记录。我们还需要在查找后展开(尽管在您的情况下它总是有一个匹配的文档),然后不需要第一个,因为我们只有一个匹配的文档。其余阶段完全相同。


推荐阅读