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

Confronto aggregazione MongoDB:group(), $group e MapReduce

È alquanto confuso poiché i nomi sono simili, ma il group() Il comando è una funzionalità e un'implementazione diverse dal $group operatore della pipeline nel Framework di aggregazione.

Il comando group(), Aggregation Framework e MapReduce sono collettivamente caratteristiche di aggregazione di MongoDB. Ci sono alcune sovrapposizioni nelle funzionalità, ma cercherò di spiegare le differenze e le limitazioni di ciascuna come in MongoDB 2.2.0.

Nota:set di risultati in linea menzionate di seguito si riferiscono a query che vengono elaborate in memoria con risultati restituiti alla fine della chiamata di funzione. Opzioni di output alternative (attualmente disponibili solo con MapReduce) potrebbero includere il salvataggio dei risultati in una raccolta nuova o esistente.

group() Comando

  • Sintassi semplice e funzionalità per il raggruppamento .. analogo a GROUP BY in SQL.

  • Restituisce il set di risultati in linea (come una matrice di elementi raggruppati).

  • Implementato utilizzando il motore JavaScript; personalizzato reduce() le funzioni possono essere scritte in JavaScript.

  • Limitazioni attuali

    • Non verrà raggruppato in un set di risultati con più di 20.000 chiavi.

    • I risultati devono rientrare nei limiti di un documento BSON (attualmente 16 MB).

    • Accetta un blocco di lettura e non consente ad altri thread di eseguire JavaScript mentre è in esecuzione.

    • Non funziona con le raccolte partizionate.

  • Vedi anche:esempi di comandi group() .

Riduci mappa

  • Implementa il modello MapReduce per l'elaborazione di set di dati di grandi dimensioni.

  • Può scegliere tra una delle diverse opzioni di output (inline, nuova raccolta, unisci, sostituisci, riduci)

  • Le funzioni MapReduce sono scritte in JavaScript.

  • Supporta raccolte di input non partizionate e partizionate.

  • Può essere utilizzato per l'aggregazione incrementale su raccolte di grandi dimensioni.

  • MongoDB 2.2 implementa un supporto molto migliore per la mappa partizionata per ridurre l'output.

  • Limitazioni attuali

    • Un singolo emit può contenere solo la metà della dimensione massima del documento BSON di MongoDB (16 MB).

    • C'è un blocco JavaScript, quindi un server mongod può eseguire solo una funzione JavaScript alla volta.. tuttavia, la maggior parte dei passaggi di MapReduce sono molto brevi, quindi i blocchi possono essere rilasciati frequentemente.

    • Il debug delle funzioni MapReduce può essere difficile. Puoi usare print() e printjson() per includere l'output diagnostico in mongod registro.

    • MapReduce generalmente non è intuitivo per i programmatori che cercano di tradurre l'esperienza di aggregazione di query relazionali.

  • Vedi anche:Mappa/Riduci esempi .

Quadro di aggregazione

  • Nuova funzionalità nella versione di produzione MongoDB 2.2.0 (agosto 2012).

  • Progettato con obiettivi specifici di miglioramento delle prestazioni e dell'usabilità.

  • Restituisce il set di risultati in linea.

  • Supporta raccolte di input non partizionate e partizionate.

  • Utilizza un approccio "pipeline" in cui gli oggetti vengono trasformati mentre passano attraverso una serie di operatori di pipeline come la corrispondenza, la proiezione, l'ordinamento e il raggruppamento.

  • Gli operatori della pipeline non devono produrre un documento di output per ogni documento di input:gli operatori possono anche generare nuovi documenti o filtrare i documenti.

  • Usando le proiezioni puoi aggiungere campi calcolati, creare nuovi sottooggetti virtuali ed estrarre sottocampi nel livello più alto dei risultati.

  • Gli operatori della pipeline possono essere ripetuti secondo necessità (ad esempio, più $project o $group passi.

  • Limitazioni attuali

    • I risultati vengono restituiti in linea, quindi sono limitati alla dimensione massima del documento supportata dal server (16 MB)

    • Non supporta tante opzioni di output come MapReduce

    • Limitato agli operatori e alle espressioni supportati dal Framework di aggregazione (ovvero non è possibile scrivere funzioni personalizzate)

    • Funzionalità del server più recente per l'aggregazione, quindi ha più spazio per maturare in termini di documentazione, set di funzionalità e utilizzo.

  • Vedi anche:Esempi di framework di aggregazione .

Qualcuno può presentare un'illustrazione o guidarmi a un collegamento in cui questi tre concetti vengono spiegati insieme, prendendo gli stessi dati di esempio, in modo da poterli confrontare facilmente?

In genere non troverai esempi in cui sarebbe utile confrontare tutti e tre gli approcci, ma ecco le precedenti domande di StackOverflow che mostrano variazioni:

  • group() rispetto a Framework di aggregazione
  • MapReduce rispetto a Framework di aggregazione