MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB sembra scegliere l'indice sbagliato durante l'aggregazione

Potresti voler leggere i documenti relativi $sort prestazioni :

Inoltre, tieni presente che si chiama 'aggregazione pipeline ' per una ragione. Semplicemente non importa dove ordini dopo la corrispondenza. Quindi la soluzione dovrebbe essere piuttosto semplice:

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

Il controllo dell'esistenza del campo file potrebbe non essere necessario quando è garantito che il campo esista in ogni record. Questo non guasta, in quanto c'è un indice sul campo. Lo stesso vale per l'ordinamento aggiuntivo:poiché ci siamo assicurati che solo i documenti contenenti un campo file entrino nella pipeline, dovrebbe essere utilizzato l'indice.