English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Aggregazione MongoDB

Le operazioni di aggregazione elaborano i record di dati e restituiscono i risultati calcolati. Le operazioni di aggregazione raggruppano i valori provenienti da più documenti e possono eseguire vari operazioni sui dati raggruppati per restituire un singolo risultato. In SQL, count(*) e group by sono equivalenti alle aggregazioni di MongoDB.

il metodo Aggregate()

Per le aggregazioni di MongoDB, dovresti utilizzare aggregate() Metodo.

Sintassi

aggregate()La sintassi di base del metodo è la seguente-

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Esempi online

Nella raccolta, disponi dei seguenti dati-

{
   _id: ObjectId(7df78ad8902c)
   title: 'Panoramica MongoDB', 
   description: 'MongoDB non è un database SQL',
   by_user: 'oldtoolbag.com',
   url: 'https://it.oldtoolbag.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'Panoramica NoSQL', 
   description: 'I database No SQL sono molto veloci',
   by_user: 'oldtoolbag.com',
   url: 'https://it.oldtoolbag.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Panoramica di Neo4j', 
   description: 'Neo4j è un database No SQL',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

Ora, se si desidera visualizzare un elenco che mostri quante tutorial hanno scritto ciascun utente dal set sopra, si utilizzerà il seguenteaggregate()Metodo-

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "oldtoolbag.com", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

La query SQL equivalente ai casi sopra è select by_user, count(*) from mycol group by by_user.

Nell'esempio sopra, abbiamo ordinato per campoby_userI documenti sono raggruppati e il valore di sum precedente aumenta ogni volta che si raggruppa per utente. Ecco l'elenco delle espressioni aggregate disponibili.

EspressioneDescrizioneEsempio
$sumCalcola la somma.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
$avgCalcola la media.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
$minOttieni il valore minimo corrispondente a tutti i documenti nella raccolta.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
$maxOttieni il valore massimo corrispondente a tutti i documenti nella raccolta.db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
$pushInserisci un valore in un array nel documento dei risultati.db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
$addToSet在结果文档中插入值到一个数组中,但不创建副本。db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
$first根据资源文档的排序获取第一个文档数据。db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
$last根据资源文档的排序获取最后一个文档数据db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

Inserisci un valore in un array di documenti di risultato, senza creare copie. $addToSet

db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

Ottieni i dati del primo documento in base all'ordinamento dei documenti delle risorse. $first

  • db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])Ottieni i dati dell'ultimo documento in base all'ordinamento dei documenti delle risorse. $last

  • db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])La pipeline di aggregazione di MongoDB trasmette i documenti MongoDB da un pipeline a un altro dopo che un pipeline è stato elaborato. Le operazioni di pipeline possono essere ripetute. La pipeline è generalmente utilizzata in Unix e Linux per passare l'output di un comando come parametro del comando successivo. Concetto di pipeline

  • Espressione: Elabora il documento di input e lo esporta. L'espressione è invariabile, può essere utilizzata solo per calcolare il documento corrente nella pipeline di aggregazione, non può elaborare altri documenti. Espressione:Ecco alcune operazioni comuni nel framework di aggregazione:

  • :Modifica la struttura dei documenti di input. Può essere utilizzato per rinominare campi, aggiungere o eliminare domini, e può anche essere utilizzato per creare risultati di calcolo e documenti annidati. $project:Utilizzato per filtrare i dati, esporta solo i documenti che soddisfano i criteri. $match utilizza l'operazione di query standard di MongoDB.

  • :Limita il numero di documenti restituiti dalla pipeline di aggregazione di MongoDB. $limit:Salta un numero specificato di documenti nella pipeline di aggregazione e restituisce i documenti rimanenti. $skip

  • :Divide un campo tipo array di un documento in più voci, ciascuna contenente un valore dell'array. $unwind:Raggruppa i documenti di una raccolta, può essere utilizzato per risultati di statistica. $group

  • ordina:Ordina i documenti di input e li esporta. $sort

  • $geoNear:Esporta documenti ordinati vicini a una posizione geografica.

istanza dell'operatore di pipeline

1、$project istanza

db.article.aggregate(
    { $project : {
        title : 1 ,
        author : 1 ,
    }}
 );

In questo modo, nel risultato rimarranno solo i campi _id, tilte e author, di default il campo _id è incluso, se si desidera escludere _id, si può fare così:

db.article.aggregate(
    { $project : {
        _id : 0 ,
        title : 1 ,
        author : 1
    }});

2. Esempio di $match

db.articles.aggregate( [
                        { $match : { score : { $gt : 70, $lte : 90 } } },
                        { $group: { _id: null, count: { $sum: 1 } } }
                       ] );

$match utilizzato per ottenere i record con punteggio maggiore di 70 e minore o uguale a 90, quindi inviare i record che soddisfano i criteri al pipeline operatore $group successivo.

3. Esempio di $skip

db.article.aggregate(
    { $skip : 5 });

Dopo l'operazione di pipeline $skip, i primi cinque documenti sono stati "filtrati".