Its totally OK if you need all of records (you cant skip fetch step) or do pagging (fetch with low limit is fast), but if you need only count why fetch all of records intstead just using index?
Use case: run ad hoc queries against Report collection, pagginate result and show total count of matching records.
Version: “4.2.6”
Query:
db.Report.explain().count({
"Financials" : {
"$elemMatch" : {
"Sales" : {
"$gte" : 100000000.0,
"$lte" : 1000000000.0
},
"Last" : true
}
},
"Type" : { "$in" : [1] }
})
Plan:
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "data.Report",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Last" : {
"$eq" : true
}
},
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
}
]
}
}
},
{
"Type" : {
"$eq" : 1
}
}
]
},
"queryHash" : "B29AE203",
"planCacheKey" : "FFE5A870",
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
},
{
"Last" : {
"$eq" : true
}
}
]
}
}
},
{
"Type" : {
"$eq" : 1
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Financials.Sales" : 1
},
"indexName" : "Financials.Sales_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"Financials.Sales" : [ "Financials" ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Financials.Sales" : [ "[100000000, 1000000000]" ]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
},
{
"Last" : {
"$eq" : true
}
}
]
}
}
},
{
"Type" : {
"$eq" : 1
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Financials.Sales" : 1,
"Financials.Last" : 1
},
"indexName" : "Financials.Sales_1_Financials.Last_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"Financials.Sales" : [ "Financials" ],
"Financials.Last" : [ "Financials" ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Financials.Sales" : [ "[100000000, 1000000000]" ],
"Financials.Last" : [ "[true, true]" ]
}
}
},
{
"stage" : "FETCH",
"filter" : {
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Last" : {
"$eq" : true
}
},
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
}
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Type" : 1
},
"indexName" : "Type_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"Type" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Type" : [ "[1, 1]" ]
}
}
},
{
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Last" : {
"$eq" : true
}
},
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
}
]
}
}
},
{
"Type" : {
"$eq" : 1
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"Financials.Last" : 1
},
"indexName" : "Financials.Last_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"Financials.Last" : [ "Financials" ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Financials.Last" : [ "[true, true]" ]
}
}
},
{
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"Type" : {
"$eq" : 1
}
},
{
"Financials" : {
"$elemMatch" : {
"$and" : [
{
"Last" : {
"$eq" : true
}
},
{
"Sales" : {
"$lte" : 1000000000
}
},
{
"Sales" : {
"$gte" : 100000000
}
}
]
}
}
}
]
},
"inputStage" : {
"stage" : "AND_SORTED",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {
"Type" : 1
},
"indexName" : "Type_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"Type" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Type" : [ "[1, 1]" ]
}
},
{
"stage" : "IXSCAN",
"keyPattern" : {
"Financials.Last" : 1
},
"indexName" : "Financials.Last_1",
"isMultiKey" : true,
"multiKeyPaths" : {
"Financials.Last" : [ "Financials" ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"Financials.Last" : [ "[true, true]" ]
}
}
]
}
}
]
},
"serverInfo" : {
"host" : "mongodb-1",
"port" : 27017,
"version" : "4.2.6",
"gitVersion" : "20364840b8f1af16917e4c23c1b5f5efd8b352f8"
},
"ok" : 1
}