Du kanske vill läsa dokumenten angående $sort
prestanda
:
Tänk också på att det kallas "aggregations pipeline ' av en anledning. Det spelar helt enkelt ingen roll var du sorterar efter matchning. Så lösningen borde vara ganska enkel:
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 } }
])
Kontrollen om filfältet finns kan vara onödigt när det är garanterat att fältet finns i varje post. Detta skadar inte, eftersom det finns ett index på fältet. Samma sak gäller för den extra sorteringen:eftersom vi såg till att endast dokument som innehåller ett filfält kommer in i pipelinen, bör indexet användas.