MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB scheint beim Aggregieren den falschen Index zu wählen

Vielleicht möchten Sie die Dokumentation zu lesen $sort Leistung :

Denken Sie auch daran, dass es als "Aggregations-Pipeline" bezeichnet wird ' aus einem Grund. Es spielt einfach keine Rolle, wo Sie nach dem Abgleich sortieren. Die Lösung sollte also ziemlich einfach sein:

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 } }
])

Die Überprüfung, ob das Dateifeld vorhanden ist, kann unnötig sein, wenn sichergestellt ist, dass das Feld in jedem Datensatz vorhanden ist. Das tut nicht weh, da sich auf dem Feld ein Index befindet. Gleiches gilt für die zusätzliche Sortierung:Da wir dafür gesorgt haben, dass nur Dokumente in die Pipeline gelangen, die ein Dateifeld enthalten, sollte der Index verwendet werden.