mongodb - $lookup get "first" 并结合 addField + exclude 字段
问题描述
我有一个集合“Notes”,其中包含对另一个名为“Chapters”的集合中嵌套问题数组中问题索引的引用。
我想出了一个工作正常的聚合,但我想知道是否有机会:
- $lookup 的限制为 1,因此我们不需要添加另一个聚合阶段只是为了从查找数组结果中获取“第一个”项,并且
- 结合最后 3 个阶段(减少阶段数),我通过索引从问题数组中“挑选”特定问题,然后将其投影到“问题”字段,并排除“问题”字段。
- 我想知道减少聚合阶段的数量是否有任何性能优势。我不知道为什么要减少或合并阶段,但感觉它应该提高性能或至少更优雅?
聚合管道是这样的:
[
{
$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有帮助吗?
我通过将限制阶段传递给 1 来减少查找以仅限制一条记录。我们还需要在查找后展开(尽管在您的情况下它总是有一个匹配的文档),然后不需要第一个,因为我们只有一个匹配的文档。其余阶段完全相同。
推荐阅读
- c++ - std::adjacent_find() 和 std::equal() 之间的区别用于检查向量中的所有元素是否相等
- java - Spring - 使用 Thymeleaf 发送表单返回空对象
- python - 使用 Python GUIZERO 如何从第二个窗口访问文本框输入数据?
- c# - Blazor 中的传统表单发布 - 目前无法发出 JavaScript 互操作调用
- reactjs - 更新 create-react-app 应用程序,但在 package.json 中找不到 react-scripts
- arrays - 改变数组元素的值
- asp.net-core - 不了解 IPNetwork.Contains 结果
- abap - 选择没有 8 个首字符的列?不允许使用“(”,应使用“(”)
- javascript - 如何使用“在哪里”从 Google Cloud Functions 中的 Firestore 文档中读取数据?
- python - 如何拼接重叠区域较小且使用广角镜头拍摄的图像?