I have a compound index in a 2d and normal field:
"key" : {
"_meta.loc.coordinates" : "2d",
"_meta.unifiedAt" : 1
},
Then I want to execute the following query with sorting:
db.static_booking
.find({ "_meta.loc.coordinates": { "$geoWithin": { "$box": [ [ -0.70724367, 51.13817111 ], [ 0.45524367, 51.86182889 ] ] } } }, {itemId: 1})
.sort({'_meta.unifiedAt': 1})
.limit(100)
The problem I have is that it takes a very long time to return the results. Checking the explain, I see that it does not use the compound index created:
> db.static_booking.find({ "_meta.loc.coordinates": { "$geoWithin": { "$box": [ [ -0.70724367, 51.13817111 ], [ 0.45524367, 51.86182889 ] ] } } }, {itemId: 1}).sort({'_meta.unifiedAt': 1}).limit(100).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "seetransparent.static_booking",
"indexFilterSet" : false,
"parsedQuery" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"winningPlan" : {
"stage" : "LIMIT",
"limitAmount" : 100,
"inputStage" : {
"stage" : "PROJECTION",
"transformBy" : {
"itemId" : 1
},
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_meta.unifiedAt" : 1
},
"indexName" : "_meta.unifiedAt_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"_meta.unifiedAt" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"_meta.unifiedAt" : [
"[MinKey, MaxKey]"
]
}
}
}
}
},
"rejectedPlans" : [
{
"stage" : "PROJECTION",
"transformBy" : {
"itemId" : 1
},
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"_meta.unifiedAt" : 1
},
"limitAmount" : 100,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_meta.loc.coordinates" : "2d"
},
"indexName" : "_meta.loc.coordinates_2d",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"_meta.loc.coordinates" : [
"[BinData(128, 6EBA300000000000), BinData(128, 6EBA3FFFFFFFFFFF)]",
"[BinData(128, 6EBA680000000000), BinData(128, 6EBA6BFFFFFFFFFF)]",
"[BinData(128, 6EBA6C0000000000), BinData(128, 6EBA6FFFFFFFFFFF)]",
"[BinData(128, 6EBA700000000000), BinData(128, 6EBA7FFFFFFFFFFF)]",
"[BinData(128, 6EBA900000000000), BinData(128, 6EBA9FFFFFFFFFFF)]",
"[BinData(128, 6EBAB00000000000), BinData(128, 6EBABFFFFFFFFFFF)]",
"[BinData(128, 6EBAC00000000000), BinData(128, 6EBACFFFFFFFFFFF)]",
"[BinData(128, 6EBAD00000000000), BinData(128, 6EBADFFFFFFFFFFF)]",
"[BinData(128, 6EBAE00000000000), BinData(128, 6EBAEFFFFFFFFFFF)]",
"[BinData(128, 6EBAF00000000000), BinData(128, 6EBAFFFFFFFFFFFF)]",
"[BinData(128, C410100000000000), BinData(128, C4101FFFFFFFFFFF)]",
"[BinData(128, C410300000000000), BinData(128, C4103FFFFFFFFFFF)]",
"[BinData(128, C410400000000000), BinData(128, C4104FFFFFFFFFFF)]",
"[BinData(128, C410500000000000), BinData(128, C4105FFFFFFFFFFF)]",
"[BinData(128, C410600000000000), BinData(128, C4106FFFFFFFFFFF)]",
"[BinData(128, C410700000000000), BinData(128, C4107FFFFFFFFFFF)]"
]
}
}
}
}
}
},
{
"stage" : "PROJECTION",
"transformBy" : {
"itemId" : 1
},
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"_meta.unifiedAt" : 1
},
"limitAmount" : 100,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_meta.loc.coordinates" : "2d",
"_meta.delisted" : 1
},
"indexName" : "_meta.loc.coordinates_2d__meta.delisted_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"_meta.loc.coordinates" : [
"[BinData(128, 6EBA300000000000), BinData(128, 6EBA3FFFFFFFFFFF)]",
"[BinData(128, 6EBA680000000000), BinData(128, 6EBA6BFFFFFFFFFF)]",
"[BinData(128, 6EBA6C0000000000), BinData(128, 6EBA6FFFFFFFFFFF)]",
"[BinData(128, 6EBA700000000000), BinData(128, 6EBA7FFFFFFFFFFF)]",
"[BinData(128, 6EBA900000000000), BinData(128, 6EBA9FFFFFFFFFFF)]",
"[BinData(128, 6EBAB00000000000), BinData(128, 6EBABFFFFFFFFFFF)]",
"[BinData(128, 6EBAC00000000000), BinData(128, 6EBACFFFFFFFFFFF)]",
"[BinData(128, 6EBAD00000000000), BinData(128, 6EBADFFFFFFFFFFF)]",
"[BinData(128, 6EBAE00000000000), BinData(128, 6EBAEFFFFFFFFFFF)]",
"[BinData(128, 6EBAF00000000000), BinData(128, 6EBAFFFFFFFFFFFF)]",
"[BinData(128, C410100000000000), BinData(128, C4101FFFFFFFFFFF)]",
"[BinData(128, C410300000000000), BinData(128, C4103FFFFFFFFFFF)]",
"[BinData(128, C410400000000000), BinData(128, C4104FFFFFFFFFFF)]",
"[BinData(128, C410500000000000), BinData(128, C4105FFFFFFFFFFF)]",
"[BinData(128, C410600000000000), BinData(128, C4106FFFFFFFFFFF)]",
"[BinData(128, C410700000000000), BinData(128, C4107FFFFFFFFFFF)]"
],
"_meta.delisted" : [
"[MinKey, MaxKey]"
]
}
}
}
}
}
},
{
"stage" : "PROJECTION",
"transformBy" : {
"itemId" : 1
},
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"_meta.unifiedAt" : 1
},
"limitAmount" : 100,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_meta.loc.coordinates" : "2d",
"_meta.delisted" : 1,
"_id" : 1
},
"indexName" : "_meta.loc.coordinates_2d__meta.delisted_1__id_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"_meta.loc.coordinates" : [
"[BinData(128, 6EBA300000000000), BinData(128, 6EBA3FFFFFFFFFFF)]",
"[BinData(128, 6EBA680000000000), BinData(128, 6EBA6BFFFFFFFFFF)]",
"[BinData(128, 6EBA6C0000000000), BinData(128, 6EBA6FFFFFFFFFFF)]",
"[BinData(128, 6EBA700000000000), BinData(128, 6EBA7FFFFFFFFFFF)]",
"[BinData(128, 6EBA900000000000), BinData(128, 6EBA9FFFFFFFFFFF)]",
"[BinData(128, 6EBAB00000000000), BinData(128, 6EBABFFFFFFFFFFF)]",
"[BinData(128, 6EBAC00000000000), BinData(128, 6EBACFFFFFFFFFFF)]",
"[BinData(128, 6EBAD00000000000), BinData(128, 6EBADFFFFFFFFFFF)]",
"[BinData(128, 6EBAE00000000000), BinData(128, 6EBAEFFFFFFFFFFF)]",
"[BinData(128, 6EBAF00000000000), BinData(128, 6EBAFFFFFFFFFFFF)]",
"[BinData(128, C410100000000000), BinData(128, C4101FFFFFFFFFFF)]",
"[BinData(128, C410300000000000), BinData(128, C4103FFFFFFFFFFF)]",
"[BinData(128, C410400000000000), BinData(128, C4104FFFFFFFFFFF)]",
"[BinData(128, C410500000000000), BinData(128, C4105FFFFFFFFFFF)]",
"[BinData(128, C410600000000000), BinData(128, C4106FFFFFFFFFFF)]",
"[BinData(128, C410700000000000), BinData(128, C4107FFFFFFFFFFF)]"
],
"_meta.delisted" : [
"[MinKey, MaxKey]"
],
"_id" : [
"[MinKey, MaxKey]"
]
}
}
}
}
}
},
{
"stage" : "PROJECTION",
"transformBy" : {
"itemId" : 1
},
"inputStage" : {
"stage" : "SORT",
"sortPattern" : {
"_meta.unifiedAt" : 1
},
"limitAmount" : 100,
"inputStage" : {
"stage" : "SORT_KEY_GENERATOR",
"inputStage" : {
"stage" : "FETCH",
"filter" : {
"_meta.loc.coordinates" : {
"$geoWithin" : {
"$box" : [
[
-0.70724367,
51.13817111
],
[
0.45524367,
51.86182889
]
]
}
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"_meta.loc.coordinates" : "2d",
"_meta.unifiedAt" : 1
},
"indexName" : "_meta.loc.coordinates_2d__meta.unifiedAt_1",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"_meta.loc.coordinates" : [
"[BinData(128, 6EBA300000000000), BinData(128, 6EBA3FFFFFFFFFFF)]",
"[BinData(128, 6EBA680000000000), BinData(128, 6EBA6BFFFFFFFFFF)]",
"[BinData(128, 6EBA6C0000000000), BinData(128, 6EBA6FFFFFFFFFFF)]",
"[BinData(128, 6EBA700000000000), BinData(128, 6EBA7FFFFFFFFFFF)]",
"[BinData(128, 6EBA900000000000), BinData(128, 6EBA9FFFFFFFFFFF)]",
"[BinData(128, 6EBAB00000000000), BinData(128, 6EBABFFFFFFFFFFF)]",
"[BinData(128, 6EBAC00000000000), BinData(128, 6EBACFFFFFFFFFFF)]",
"[BinData(128, 6EBAD00000000000), BinData(128, 6EBADFFFFFFFFFFF)]",
"[BinData(128, 6EBAE00000000000), BinData(128, 6EBAEFFFFFFFFFFF)]",
"[BinData(128, 6EBAF00000000000), BinData(128, 6EBAFFFFFFFFFFFF)]",
"[BinData(128, C410100000000000), BinData(128, C4101FFFFFFFFFFF)]",
"[BinData(128, C410300000000000), BinData(128, C4103FFFFFFFFFFF)]",
"[BinData(128, C410400000000000), BinData(128, C4104FFFFFFFFFFF)]",
"[BinData(128, C410500000000000), BinData(128, C4105FFFFFFFFFFF)]",
"[BinData(128, C410600000000000), BinData(128, C4106FFFFFFFFFFF)]",
"[BinData(128, C410700000000000), BinData(128, C4107FFFFFFFFFFF)]"
],
"_meta.unifiedAt" : [
"[MinKey, MaxKey]"
]
}
}
}
}
}
}
]
},
"serverInfo" : {
"host" : "production",
"port" : 27017,
"version" : "3.4.3",
"gitVersion" : "f07437fb5a6cca07c10bafa78365456eb1d6d5e1"
},
"ok" : 1
}
As it is not using the index that I created, I try to use the hint method to force the index, but then I get an error in the result:
> db.static_booking.find({ "_meta.loc.coordinates": { "$geoWithin": { "$box": [ [ -0.70724367, 51.13817111 ], [ 0.45524367, 51.86182889 ] ] } } }, {itemId: 1}).sort({'_meta.unifiedAt': 1}).limit(100).hint({'_meta.loc.coordinates': '2d', '_meta.unifiedAt': 1})
Error: error: {
"ok" : 0,
"errmsg" : "Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.",
"code" : 96,
"codeName" : "OperationFailed"
}
As long as I use a limit larger than 2, then the error will appear. How can I solve this issue? Thanks.