I'm trying to use aggregation framework with $match
and $group
stages. Does $group
stage use index data? I'm using latest available mongodb version - 2.5.4
问题:
回答1:
$group
does not use index data.
From the mongoDB docs:
The $match and $sort pipeline operators can take advantage of an index when they occur at the beginning of the pipeline.
The $geoNear pipeline operator takes advantage of a geospatial index. When using $geoNear, the $geoNear pipeline operation must appear as the first stage in an aggregation pipeline.
回答2:
Changed in version 3.2: Starting in MongoDB 3.2, indexes can cover an aggregation pipeline. In MongoDB 2.6 and 3.0, indexes could not cover an aggregation pipeline since even when the pipeline uses an index, aggregation still requires access to the actual documents.
https://docs.mongodb.com/master/core/aggregation-pipeline/#pipeline-operators-and-indexes
回答3:
As 4J41's answer says, $group
does not (directly) use an index, although $sort
does if it is the first stage in the pipeline. However, it seems possible that $group
could, in principle, have an optimised implementation if it immediately follows a $sort
, in which case you could make it effectively make use of an index by putting a $sort
before hand.
There does not seem to be a straight answer either way in the docs about whether $group
has this optimisation (although I bet there would be if it did, so this suggests it doesn't). The answer is in MongoDB bug 4507: currently $group
does NOT have this implementation, so the top line of 4J41's answer is right after all. If you really need efficiency, depending on the application it may be quickest to use a regular query and do the grouping in your client code.