Vous voudrez peut-être lire la documentation concernant $sort
performances
:
N'oubliez pas non plus qu'il s'agit d'un "pipeline d'agrégation". ' pour une raison. Peu importe où vous triez après la correspondance. La solution devrait donc être assez simple :
db.access_log.aggregate([
{
"$match": {
"visit_dt": {
"$gte": ISODate('2015-03-09'),
"$lt": ISODate('2015-03-11')
},
"file": {"$exists": true }
}
},
{ "$sort": { "file": 1 } },
{ "$project": { "file": 1, "_id": 0 } },
{ "$group": { "_id": "$file", "count": { "$sum": 1 } } },
{ "$sort": { "count": -1 } }
])
La vérification de l'existence du champ de fichier peut être inutile lorsqu'il est garanti que le champ existe dans chaque enregistrement. Cela ne fait pas de mal, car il y a un index sur le terrain. Il en va de même pour le tri supplémentaire :puisque nous nous sommes assurés que seuls les documents contenant un champ de fichier entrent dans le pipeline, l'index doit être utilisé.