javascript - mongodb - 使用 COLLSCAN 而不是索引的 $lookup 管道
问题描述
我正在尝试在我的$lookup
管道上使用索引,但它似乎没有按预期工作。
这是我的查询:
db.map_levels.explain().aggregate([
{
$lookup:
{
from:
"map_level_revisions",
pipeline:
[
{
$match:
{
$expr:
{
$eq:
[
"$account_id",
ObjectId("5b66ca21d6b54f479bef62a4")
]
}
}
}
],
as:
"revisions"
}
},
])
这是解释:
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test-creator.map_levels",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
}
},
{
"$lookup" : {
"from" : "map_level_revisions",
"as" : "revisions",
"let" : {
},
"pipeline" : [
{
"$match" : {
"$expr" : {
"$eq" : [
"$account_id",
ObjectId("5b66ca21d6b54f479bef62a4")
]
}
}
}
]
}
}
],
"ok" : 1
}
如何让它使用索引?
请注意,查询确实返回了文档。
解决方案
解释输出中的集合扫描指的是map_levels
集合,如queryPlanner.namespace
值中所述。该$lookup
阶段将来自另一个集合的数据合并到当前管道中。由于您没有在 之前指定任何查询阶段$lookup
,因此map_levels
将使用集合扫描来迭代集合。如果在没有任何过滤或排序条件的情况下加载整个集合,则集合扫描的开销比迭代索引和获取文档的开销要小。
$match
您可以通过在您之前添加一个阶段来避免当前集合扫描$lookup
(假设您不想处理完整map_levels
集合)。
如何检查使用的索引
$lookup
?
不幸的是,查询解释输出并不(如 MongoDB 4.0)指示$lookup
阶段的索引使用情况。解决方法是使用您的查找pipeline
作为顶级聚合查询运行解释。
在 MongoDB 问题跟踪器中有一个相关的问题需要关注/支持:SERVER-22622:改进 $lookup 解释以指示“来自”集合的查询计划。
推荐阅读
- python - 滞后按列分组的多个变量
- scala - 安装 sbt 后无法在 sbt:bin 中检查 scala 版本
- python-3.x - 使用 Lookahead positive 识别单字符词
- visual-studio-code - 如何在我的 devcontainer 中指定现有的 docker-compose.yml 文件
- python - 从 api 接收数据。蟒蛇,请求
- swift - 保存到本地存储 Swift
- python - 我正在尝试让我的 txt 文件在 URL API 上输入每一行,但没有收到错误消息并且无法正确运行
- visual-studio-2019 - 如何禁用 IntelliSense 上下文感知代码完成?
- mysql - 使用 Node JS 错误连接 AWS RDS:无法读取未定义的属性“查询”
- objective-c - 如何使用 NSViewController 将自定义视图连接到模型?