簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM