I am stuck in this simple prefix request. Although Mongo docs claim that you can get pretty good performance using the regex prefix format (/ ^ a /), the request is pretty slow when I try to sort the results:
940 millis
db.posts.find ({hashtags: / ^ noticias /}). limit (15) .sort ({rank: -1}). hint ('hashtags_1_rank_-1'). explain ()
{ "cursor" : "BtreeCursor hashtags_1_rank_-1 multi", "isMultiKey" : true, "n" : 15, "nscannedObjects" : 142691, "nscanned" : 142692, "nscannedObjectsAllPlans" : 142691, "nscannedAllPlans" : 142692, "scanAndOrder" : true, "indexOnly" : false, "nYields" : 1, "nChunkSkips" : 0, "millis" : 934, "indexBounds" : { "hashtags" : [ [ "noticias", "noticiat" ], [ /^noticias/, /^noticias/ ] ], "rank" : [ [ { "$maxElement" : 1 }, { "$minElement" : 1 } ] ] }, "server" : "XRTZ048.local:27017" }
However, an unsorted version of the same query is super fast:
0 millis
db.posts.find ({hashtags: / ^ noticias /}). limit (15) .hint ('hashtags_1_rank_-1'). explain ()
{ "cursor" : "BtreeCursor hashtags_1_rank_-1 multi", "isMultiKey" : true, "n" : 15, "nscannedObjects" : 15, "nscanned" : 15, "nscannedObjectsAllPlans" : 15, "nscannedAllPlans" : 15, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "hashtags" : [ [ "noticias", "noticiat" ], [ /^noticias/, /^noticias/ ] ], "rank" : [ [ { "$maxElement" : 1 }, { "$minElement" : 1 } ] ] }, "server" : "XRTZ048.local:27017"
}
The query also executes quickly if I remove the regex and sort:
0 millis
db.posts.find ({hashtags: 'noticias'}). limit (15) .sort ({rank: -1}). hint ('hashtags_1_rank_-1'). explain ()
{ "cursor" : "BtreeCursor hashtags_1_rank_-1", "isMultiKey" : true, "n" : 15, "nscannedObjects" : 15, "nscanned" : 15, "nscannedObjectsAllPlans" : 15, "nscannedAllPlans" : 15, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "hashtags" : [ [ "noticias", "noticias" ] ], "rank" : [ [ { "$maxElement" : 1 }, { "$minElement" : 1 } ] ] }, "server" : "XRTZ048.local:27017"
}
Using both regular expression and sorting, it seems that Mongo scans a lot of records. However, sorting only scans 15 unless I use a regex. What is wrong here?