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

Mongodb Spiega per il framework di aggregazione

A partire da MongoDB versione 3.0, semplicemente cambiando l'ordine da

collection.aggregate(...).explain()

a

collection.explain().aggregate(...)

ti darà i risultati desiderati (documentazione qui).

Per le versioni precedenti>=2.6, dovrai utilizzare explain opzione per operazioni di pipeline di aggregazione

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Una considerazione importante con Aggregation Framework è che un indice può essere utilizzato solo per recuperare i dati iniziali per una pipeline (ad es. utilizzo di $match , $sort , $geonear all'inizio di una pipeline) e il successivo $lookup e $graphLookup fasi. Una volta che i dati sono stati recuperati nella pipeline di aggregazione per l'elaborazione (ad es. passando attraverso fasi come $project , $unwind e $group ) ulteriori manipolazioni saranno in memoria (possibilmente utilizzando file temporanei se allowDiskUse l'opzione è impostata).

Ottimizzazione delle pipeline

In generale, puoi ottimizzare le pipeline di aggregazione:

  • Avvio di una pipeline con un $match fase per limitare l'elaborazione ai documenti pertinenti.
  • Garantire la $match iniziale / $sort le fasi sono supportate da un efficiente indice.
  • Filtraggio anticipato dei dati utilizzando $match , $limit e $skip .
  • Ridurre al minimo le fasi non necessarie e la manipolazione dei documenti (magari riconsiderando il tuo schema se sono necessarie complicate ginnastica di aggregazione).
  • Sfruttando i nuovi operatori di aggregazione se hai aggiornato il tuo server MongoDB. Ad esempio, MongoDB 3.4 ha aggiunto molte nuove fasi ed espressioni di aggregazione, incluso il supporto per lavorare con array, stringhe e facet.

Ci sono anche una serie di ottimizzazioni della pipeline di aggregazione che si verificano automaticamente a seconda della versione del server MongoDB. Ad esempio, le fasi adiacenti possono essere unite e/o riordinate per migliorare l'esecuzione senza influire sui risultati di output.

Limiti

Come in MongoDB 3.4, il Framework di aggregazione explain l'opzione fornisce informazioni su come viene elaborata una pipeline ma non supporta lo stesso livello di dettaglio di executionStats modalità per un find() interrogazione. Se ti concentri sull'ottimizzazione dell'esecuzione iniziale della query, probabilmente troverai utile rivedere l'equivalente find().explain() interrogare con executionStats o allPlansExecution verbosità.

Ci sono alcune richieste di funzionalità rilevanti da guardare/votare nel tracker dei problemi di MongoDB riguardo a statistiche di esecuzione più dettagliate per aiutare a ottimizzare/profilare le pipeline di aggregazione:

  • SERVER-19758:Aggiungi "executionStats" e "allPlansExecution" spiegano le modalità per spiegare l'aggregazione
  • SERVER-21784:traccia le statistiche di esecuzione per ogni fase della pipeline di aggregazione ed esponi tramite spiegare
  • SERVER-22622:Migliora la spiegazione di $lookup per indicare il piano di query nella raccolta "da"