gpt4 book ai didi

javascript - mongodb - 使用 COLLSCAN 而不是索引的 $lookup 管道

转载 作者:行者123 更新时间:2023-11-30 19:51:54 32 4
gpt4 key购买 nike

我正在尝试在我的 $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 集合将使用集合扫描进行迭代。如果在没有任何过滤或排序条件的情况下加载整个集合,则集合扫描的开销比迭代索引和获取文档的开销要少。

您可以通过在 $lookup 之前添加一个 $match 阶段来避免当前集合扫描(假设您不想处理完整的 map_levels 集合)。

How can I check the index used by $lookup?

不幸的是,查询解释输出没有(在 MongoDB 4.0 中)指示 $lookup 阶段的索引使用情况。解决方法是使用查找的 pipeline 作为顶级聚合查询来运行 explain。

MongoDB 问题跟踪器中有一个相关问题需要关注/投票:SERVER-22622: Improve $lookup explain to indicate query plan on the "from" collection .

关于javascript - mongodb - 使用 COLLSCAN 而不是索引的 $lookup 管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54383148/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com