[英]mongodb - aggregation with $match $in with a $lookup pipeline
[英]mongodb - $lookup pipeline using COLLSCAN instead of index
我正在嘗試在$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
集合)。
如何檢查
$lookup
使用的索引?
不幸的是,查詢說明輸出不會(在MongoDB 4.0中)指示$lookup
階段的索引使用情況。 為此,將運行一種解決方法,將您的查找pipeline
用作頂級聚合查詢。
MongoDB問題跟蹤器中有一個相關的問題需要關注/更新: SERVER-22622:改進$ lookup說明以指示“ from”集合上的查詢計划 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.