Spring 数据 mongodb 的 MongoTempate 中聚合查询的执行计划
Execution plan of aggregate query in MongoTempate with Spring data mongodb
我正在使用 spring 数据 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}}}}
我想知道这个查询的执行计划。
我如何才能知道我的索引是否在该查询期间被使用?
请注意,为了执行以下步骤,您需要 mongo shell 可以理解的工作聚合查询。
按照以下步骤操作:-
1) 转到 mongo shell
2) 执行use命令切换到你的数据库
use <database name>
3) 执行以下查询。我希望线程中提到的聚合查询在语法上是正确的。另外,请在以下语法中相应地更改集合名称。
db.yourCollectionName.explain().aggregate({ "stayRecord" , "pipeline" : [ { "$match" : { "vehicleId" : { "$all" : [ 10]}}} , { "$match" : { "stayTime" : { "$gte" : { "$date" : "2016-06-20T18:30:00.000 Z"}}}} , { "$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]"
]
}
}
}
}
}
我正在使用 spring 数据 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}}}}
我想知道这个查询的执行计划。 我如何才能知道我的索引是否在该查询期间被使用?
请注意,为了执行以下步骤,您需要 mongo shell 可以理解的工作聚合查询。
按照以下步骤操作:-
1) 转到 mongo shell 2) 执行use命令切换到你的数据库
use <database name>
3) 执行以下查询。我希望线程中提到的聚合查询在语法上是正确的。另外,请在以下语法中相应地更改集合名称。
db.yourCollectionName.explain().aggregate({ "stayRecord" , "pipeline" : [ { "$match" : { "vehicleId" : { "$all" : [ 10]}}} , { "$match" : { "stayTime" : { "$gte" : { "$date" : "2016-06-20T18:30:00.000 Z"}}}} , { "$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]"
]
}
}
}
}
}