1

我正在使用spring data mongodb,因为想要聚合查询来实现我正在使用带有聚合方法的MongoTemplate。当我跟踪日志时,它显示如下查询:

find: track.$cmd { "aggregate" : "stayRecord" , "pipeline" : [ { "$match" : { "vehicleId" : { "$all" : [ 10]}}} , { "$match" : { "stayTime" : { "$gte" : { "$date" : "2016-06-20T18:30:00.000Z"}}}} , { "$match" : { "stayTime" : { "$lt" : { "$date" : "2016-06-21T18:30:00.000Z"}}}} , { "$group" : { "_id" : "$stayTime" , "count" : { "$sum" : 1}}}}

我想知道这个查询的执行计划。如何确定在该查询期间是否使用了我的索引?

4

1 回答 1

1

请注意,为了遵循以下步骤,您需要 mongo shell 可以理解的工作聚合查询。

请按照以下步骤操作:-

1) 进入 mongo shell 2) 执行 use 命令切换到你的数据库

use <database name>

3) 执行以下查询。我希望线程中提到的聚合查询在语法上是正确的。另外,请在以下语法中相应地更改集合名称。

D b。yourCollectionName .explain().aggregate({ "stayRecord" , "pipeline" : [ { "$match" : { "vehicleId" : { "$all" : [ 10]}}} , { "$match" : { " stayTime”:{“$gte”:{“$date”:“2016-06-20T18:30:00.000Z”}}}},{“$match”:{“stayTime”:{“$lt”:{ “$date”:“2016-06-21T18:30:00.000Z”}}}},{“$group”:{“_id”:“$stayTime”,“count”:{“$sum”:1} }}});

2) 在输出中,请找到“winningPlan”元素。在输入阶段(“inputStage”)属性中,如果查询使用索引,它将显示值为“IXSCAN” ,如果查询使用索引,则显示索引名称。否则,它将显示“COLLSCAN”,这意味着查询使用了集合扫描(即未使用索引)。

"winningPlan" : {
            "stage" : "LIMIT",
            "limitAmount" : 0,
            "inputStage" : {
                "stage" : "SKIP",
                "skipAmount" : 0,
                "inputStage" : {
                    "stage" : "FETCH",
                    "filter" : {
                        "user.followers_count" : {
                            "$gt" : 1000
                        }
                    },
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "keyPattern" : {
                            "created_at" : -1
                        },
                        "indexName" : "created_at_-1",
                        "isMultiKey" : false,
                        "direction" : "backward",
                        "indexBounds" : {
                            "created_at" : [
                                "[MinKey, MaxKey]"
                            ]
                        }
                    }
                }
            }
        }
于 2016-06-24T13:04:59.793 回答