Introduzione
In questo articolo vi presenterò il gruppo Mongodb per campi multipli. Per capire meglio prima impareremo la funzione di aggregazione.
Funzione di aggregazione Mongodb
Le funzioni di aggregazione sono utilizzate nelle clausole GROUP BY per aggregare i dati raggruppati. Le funzioni di aggregazione funzionano meglio se usate con la clausola GROUP BY. Tuttavia, l’uso della funzione di aggregazione non è limitato alle query raggruppate.
Quando una funzione aggregata viene usata in una query senza la clausola GROUP BY, la funzione aggregata aggrega l’intero set di risultati (tutte le righe che corrispondono alla clausola WHERE). Se non usi la clausola GROUP BY, alcune funzioni aggregate nella lista SELECT possono essere usate solo con altre funzioni aggregate. Ecco perché la funzione aggregata deve usare la clausola GROUP BY per collegarsi alla lista nella lista SELECT.
Per esempio, invece di usare la clausola GROUP BY, AVG in una lista SELECT può solo corrispondere a SUM, ma non può corrispondere a una colonna specifica.
L’operazione di aggregazione MongoDB è usata per operazioni in batch sui dati. Dopo che la collezione è stata raggruppata per condizione, viene eseguita una serie di operazioni come somma, media e altre. Le operazioni di aggregazione possono eseguire complesse operazioni di raccolta, specialmente per le statistiche matematiche e il data mining.
L’input dell’operazione di aggregazione in MongoDB è il documento di raccolta. L’output può essere uno o più documenti. MongoDB offre un’operazione di aggregazione molto potente che può essere divisa in tre categorie:
- Podotto di aggregazione
- Operazione di aggregazione per uso singolo
- Modello di programmazione MapReduce
Mongodb Group by Multiple Fields
L’operatore $ group è un aggregatore che ritorna un nuovo documento. Ha il proprio operatore, possiamo ottenere il campo del documento corrente tramite il simbolo $ + il nome del campo. Per capire prima il gruppo MongoDB per campi multipli, diamo un’occhiata alla lista di tutti gli operatori che possono essere usati in $ group:
- $ sum – Restituisce la somma di tutti i campi numerici.
- $ avg – Calcola la media tra i campi numerici.
- $ min – Restituisce il valore minimo dal campo numerico
- $ max – Ottiene il valore massimo dal campo numerico.
- $ push – Inserisce il valore del campo nel campo risultato
- $ addToSet – Inserisce un valore in un array del documento risultante, ma non crea duplicati.
- $ first – Ottiene solo il primo documento da quelli raggruppati, solitamente per l’ordinamento.
- $ ultimo – Restituisce l’ultimo documento.
Pipeline di aggregazione
In modalità POSIX multithreaded, esiste un metodo chiamato pipeline, il cui flusso di elementi di dati viene eseguito in modo sequenziale da un insieme di thread nell’ordine specificato.La pipeline di aggregazione consiste in uno stadio. Dopo aver elaborato il documento in uno stadio, la pipeline di aggregazione trasferisce il risultato dell’elaborazione allo stadio successivo.
Funzione tubo polimerico Filtrare il documento per scoprire quali documenti soddisfano i criteri. Convertire il documento e cambiare la forma di output del documento.
Ogni livello della pipeline di aggregazione è definito usando operatori di stadio, e ogni operatore di stadio può usare operatori di espressione per calcolare la somma, la media, la concatenazione, o le interruzioni di linea prima di ogni livello. Il risultato viene restituito alla fine e il risultato restituito può essere emesso direttamente o salvato nella collezione.
Flusso di elaborazione
- Db.collection.aggregate () può usare diversi canali allo stesso tempo per l’elaborazione dei dati.
- Db.collection.aggregate () usa le operazioni native di MongoDB per aggregare in modo efficiente e supportare operazioni come GroupBy in SQL senza dover scrivere routine JS personalizzate.
- Ogni fase della pipeline limita 100 MB di memoria. Se una pipeline a nodo singolo supera il limite, MongoDB genera un errore. Per elaborare grandi quantità di dati, impostare la proprietà allowDiskUse su true per scrivere i dati in un file temporaneo per un nodo di pipeline aggregato e consentire un limite di memoria di 100 MB.
- Db.collection.aggregate () può essere applicato a una serie di fette, ma il risultato non può essere perso nella serie di fette. MapReduce può essere applicato a una serie di fette, e il risultato può essere perso in una serie di fette.
- Db.collection.aggregate () restituisce un cursore, i dati sono memorizzati in memoria e possono essere gestiti direttamente come MongoShell.
- L’output di db.collection.aggregate () può essere salvato solo in un documento, e la dimensione del documento BSON è limitata a 16 MB.
Metodo Grouping
L’utilizzo del metodo group è simile all’utilizzo della clausola GROUP BY in SQL. Il metodo group ha tre parametri:
- Key: Visualizza la chiave del gruppo
- Initial: Inizializza il campo del documento che rappresenta il gruppo di documenti
- Reduce: Una funzione che restituisce il numero di elementi. Questa funzione usa due parametri come argomenti: l’elemento corrente e il documento risultato aggregato per il gruppo corrente.
- Keyf: parametro opzionale. Usa una funzione diversa dall’argomento key per rappresentare l’oggetto chiave di ritorno.
- Cond: parametro opzionale. Specifica che la condizione deve restituire true, altrimenti il documento non parteciperà al raggruppamento. Se questo parametro non è specificato, tutti i documenti partecipano al raggruppamento.
- Finalize: parametro opzionale. Rappresenta una funzione che viene attivata prima di restituire un risultato raggruppato.
Per esempio:`
js> db.users.group ({key: {name : true}, initial: {totale : 0},reduce : function (curr, res){res.total += 1}})`
Diamo un’occhiata all’espressione. Il parametro key specifica che il gruppo sarà raggruppato per nome: key: {name: true}
Il valore del parametro initial inizializza i campi che rappresentano il documento risultato per il gruppo. In questo caso, viene impostato il valore iniziale del campo total. Questo campo indica il numero di elementi nel gruppo. Poiché potrebbe non esserci alcun elemento, inizializziamo a zero.
Il parametro reduce rappresenta una funzione dove il parametro curr punta all’oggetto corrente nel gruppo e res rappresenta il gruppo corrente. Se trovate un altro oggetto con un valore specifico per il campo nome, aggiungete quel documento al gruppo e aumentate il valore totale nel documento res di 1.
L’uso di $group
Il $group usa _id per specificare il nome della chiave da raggruppare, usando le statistiche del campo personalizzato. L’uso dell’operazione aggregata cancellerà il concetto di gruppo Mongodb per campi multipli.
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
db.users.aggregate({
$match : { age: { $gte : 18 } } },{ $group : { _id:$username, count:{$sum:1} } }); // Mongodb group by multiple fields db.users.aggregate({ $match: {età: {$gte:18} }}, $group: {_id:{username:$username, age:$ge}, ‘count’:{$sum:1} } }) // $sum:val Aggiungi val a ogni documento // $avg:val Media il valore di ogni documento db.users.aggregate({ $group: { _id:$username, count:{$avg:$age} } }) db.users.aggregate({ $group: { _id:$username, count:{$max:$age} } }) db.users.aggregate({ $group: {_id:$username, count:{$min:$age} } }) // $first:val Diventa primo nel gruppo db.users.aggregate({ $group:{_id:$username, count:{$first: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$last: $age} } }) db.users.aggregate({ $group: {_id:$username, count:{$addToSet: $age} } }) db.users.aggregate({ $group:{_id:$username, count:{$push: $age} } }) |
Mongodb group by multiple fields using Aggregate operation
Prima si seleziona la chiave su cui si basa il raggruppamento e poi si divide la collezione in gruppi secondo il valore della chiave selezionata. È quindi possibile creare un documento finale aggregando i documenti in ogni gruppo.
Il gruppo non supporta cluster frammentati e non può eseguire lo shard clustering. Se hai bisogno di un supporto distribuito, devi usare aggregate o mapReduce.
1
2 3 4 5 6 7 8 9 10 11 12 13 |
db.collection.group(document)
{ # Raggruppamento campo chiave:{chiave1, chiave2:1}, # Condizioni della query cond:{}, # Funzione aggregata reduce:function(current, result){}, # inizializzazione iniziale:{}, # Conteggio ritorno funzione set finalize:function(){} } |
Calcolare il numero di elementi in ogni colonna
1
2 3 4 5 6 7 8 9 |
SELECT COUNT(*) FROM goods GROUP BY category_id;
db.goods.group({ key:{category_id:1}, cond:{},// tutti insieme reduce:function(current, result){// Corrisponde alla riga corrente,result Corrisponde a più righe nel gruppo result.total += 1; }, initial:{total:0} }) |
Conclusione
Questo articolo è scritto per gli sviluppatori per capire il gruppo Mongodb per campi multipli usando la funzione aggregata. Se trovi questo articolo utile continua a visitare Object Rocket per altri articoli relativi ai database.
Se hai bisogno di consigli o aiuto per gestire la sicurezza del tuo database, la scalabilità o i backup non esitare a contattarci a Object Rocket.