MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB semble choisir le mauvais index lors de l'agrégation

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é.