MongoDB 5: le nuove caratteristiche

MongoDB è il database NoSQL più utilizzato al mondo. La sua crescita continua è dovuta al continuo sviluppo di nuove funzionalità. La versione 5, uscita a fine luglio 2021, ha introdotto alcune novità molto interessanti. In questo articolo analizzeremo le più rilevanti e più utili nel loro impiego quotidiano.

Share

Reading time: 4 minutes

MongoDB è il database NoSQL documentale più utilizzato al mondo e, negli ultimi anni, sta diventando una valida alternativa ai database relazionali. Basti pensare che è il numero 1 tra i database NoSQL e il quinto in classifica generale tra tutti i database.

Cosa lo rende così speciale che molte aziende hanno deciso di puntare su di lui rispetto ai più tradizionali database relazionali? Le sue caratteristiche sono la risposta. Oltre ad essere schemaless, ossia la mancanza di una definizione di uno schema fisso dei dati che permette una riduzione dei tempi di produzione del software, le funzionalità rilasciate ad ogni release ne aumentano le capacità di gestire dati sempre più complessi in diversi contesti applicativi. Se siete curiosi di apprendere come utilizzare in modo efficiente MongoDB mediante pattern di modellazione vi consigliamo il libro Progettare con MongoDB: I migliori modelli per le applicazioni.

In questo articolo analizzeremo le più importanti novità dell’ultima versione rilasciata il 13 Luglio 2021, ossia la MongoDB 5.

MongoDB 5 introduce le collezioni di serie temporali che memorizzano in modo efficiente sequenze di misurazioni effettuate in un periodo di tempo. Questa caratteristica permette l’impiego di MongoDB 5 nel campo dell’Internet Of Things (IOT). L’utilizzo di questa tipologia di collezione rispetto alle collezioni standard migliora l’efficienza delle query e riduce l’uso del disco per i dati e gli indici secondari.

Le collezioni di serie temporali si comportano come le normali collezioni. Pertanto, l’inserimento e l’interrogazione dei dati avviene come per le altre collezioni. Internamente MongoDB tratta questa tipologia di collezioni come viste non materializzate scrivibili su collezioni interne che organizzano automaticamente i dati delle serie temporali in un formato di archiviazione ottimizzato all’inserimento.

Le query sulle collezioni di serie temporali traggono vantaggio dal formato di archiviazione interna ottimizzato, restituendo risultati più velocemente.

Comandi

Creazione di una collezione per le serie temporali

E’ necessario definire in modo esplicito che una collezione è adibita per le serie temporali mediante il comando db.createCollection(). Non si può trasformare una collezione esistente in questa tipologia. Di seguito è riportato un esempio di creazione di una collezione per serie temporali.

db.createCollection(
    "weather24h",
    {
       timeseries: {
          timeField: "timestamp",
          metaField: "metadata",
          granularity: "hours"
       },
       expireAfterSeconds: 86400
    }
) 

Durante la creazione è possibile specificare i seguenti parametri.

ParametroTipoDescrizione
timeseries.timeFieldstringRichiesto. Il nome del campo che contiene la data in ogni documento della serie temporale. I documenti in una collezione di serie temporali devono avere una data BSON valida come valore per il timeField.
timeseries.metaFieldstringOpzionale. Il nome del campo che contiene metadati in ogni documento delle serie temporali. I metadati nel campo specificato dovrebbero essere dati utilizzati per etichettare una serie unica di documenti e dovrebbero cambiare raramente o addirittura mai.

Il nome del campo specificato non può essere _id o lo stesso di timeseries.timeField. Il campo non può essere di tipo array.
timeseries.granularitystringOpzionale. I valori possibili sono "seconds", "minutes" e "hours". La granularità di default è impostata a "seconds".

Per migliorare le performance è necessario impostare un valore corrispondente all'intervallo di tempo più vicino tra le misurazioni che si desidera memorizzare. Nel caso si specifichi il campo timeseries.metaField, è necessario considerare l'intervallo di tempo tra le misurazioni consecutive che hanno lo stesso valore unico per il campo metaField, ossia quelle che provengono dalla stessa fonte. Diversamente, si deve considerare l'intervallo di tempo tra tutte le misurazioni che verranno inserite nella collezione.
expireAfterSecondsnumberOpzionale. Abilita la cancellazione automatica dei documenti nella collezione specificando il numero di secondi dopo i quali i documenti scadono. MongoDB, mediante un indice di tipo Time To Live (TTL) cancellerà automaticamente i documenti scaduti.

Inserimento delle misure

Ogni documento inserito deve contenere una sola misura. Per inserire un singolo documento, si usa il metodo db.collection.insertOne(). Diversamente si usa il metodo insertMany() come riportato di seguito.

db.weather.insertMany([{
   "metadata": [{"sensorId": 5578}, {"type": "temperature"}],
   "timestamp": ISODate("2021-05-18T00:00:00.000Z"),
   "temp": 12
}, {
   "metadata": [{"sensorId": 5578}, {"type": "temperature"}],
   "timestamp": ISODate("2021-05-18T04:00:00.000Z"),
   "temp": 11
}]) 

Query e aggregation pipeline

Per interrogare un documento da una collezione di serie temporali, si eseguono le query con la sintassi di default. Ad esempio per recuperare i documenti con una certo timestamp si effettua la seguente query.

db.weather.findOne({
   "timestamp": {"$date": "2021-05-11T04:00:00.000Z"}
}) 

E’ possibile anche usare l’aggregation pipeline per effettuare query più complesse. Per esempio, se si vuole calcolare la temperatura media rilevata durante ciascun giorno si esegue la seguente pipeline.

db.weather.aggregate([
   {
      $project: {
         date: {
            $dateToParts: { date: "$timestamp" }
         },
         temp: 1
      }
   },
   {
      $group: {
         _id: {
            date: {
               year: "$date.year",
               month: "$date.month",
               day: "$date.day"
            }
         },
         avgTmp: { $avg: "$temp" }
      }
   }
]) 

Il comando $dateToParts estrae i valori dei vari campi del timestamp e li salva nel campo date come un embedded document. In questo modo è possibile poi raggruppare le misure in base al giorno, mese e anno. Nel caso si volesse filtrare i risultati per un giorno specifico si dovrebbe inserire uno stage di tipo $match.

Aggregation pipeline

Nell’aggregation pipeline sono state aggiunte diverse nuove funzionalità. Oltre ad un miglioramento di alcuni operatori ottenuto grazie all’uso degli indici, di seguito illustriamo le novità più rilevanti rispetto alle versioni precedenti.

Nuovi operatori

MongoDB 5 introduce dei nuovi operatori per l’aggregation pipeline riportati di seguito.

OperatoreDescrizione
$count$count (accumulatore di aggregazione) fornisce un conteggio di tutti i documenti quando viene usato nella pipeline esistente $group e nel nuovo stage $setWindowFields di MongoDB 5.0.
$dateAddIncrementa un oggetto Date di un numero specificato di unità di tempo.
$dateDiffRestituisce la differenza tra due date.
$dateSubtractDecrementa un oggetto Date di un numero specificato di unità di tempo.
$dateTruncTronca una data.
$getFieldRestituisce il valore di un campo specificato da un documento. Si può usare $getField per recuperare il valore dei campi con nomi che contengono punti (.) o iniziano con il segno del dollaro ($).
$sampleRateSi usa per selezionare probabilisticamente i documenti da una pipeline ad un dato tasso.
$setFieldAggiunge, aggiorna o rimuove un campo specificato in un documento. Puoi usare $setField per aggiungere, aggiornare o rimuovere campi con nomi che contengono punti (.) o iniziano con il segno del dollaro ($).
$randGenera un valore float casuale tra 0 e 1 ogni volta che viene eseguito. Il nuovo operatore $sampleRate è basato su $rand.

Operatore Window

MongoDB 5.0 introduce lo stage $setWindowFields per eseguire operazioni su un intervallo specificato, detto finestra, di documenti all’interno di una collezione. L’operazione restituisce i risultati in base all’operatore di finestra scelto.

Per esempio, si può usare lo stadio $setWindowFields per produrre il risultato di:

  • Differenza nelle vendite tra due documenti in un insieme.
  • Classifiche delle vendite.
  • Totali cumulativi delle vendite.
  • Analisi di informazioni complesse sulle serie temporali senza esportare i dati in un database esterno.

Ad esempio si può calcolare la quantità cumulativa di vendite di torte per ogni stato con il comando seguente.

db.cakeSales.aggregate( [
   {
      $setWindowFields: {
         partitionBy: "$state",
         sortBy: { orderDate: 1 },
         output: {
            cumulativeQuantityForState: {
               $sum: "$quantity",
               window: {
                  documents: [ "unbounded", "current" ]
               }
            }
         }
      }
   }
] ) 

Il parametro partitionBy: “$state” partiziona i documenti in base al valore del campo state. All’interno di ogni partizione i documenti vengono ordinati per valori crescenti del campo orderDate (il più vecchio orderDate è il primo). Infine, lo stage imposta un campo cumulativeQuantityForState per il calcolo della quantità cumulativa per ogni stato. Il calcolo viene effettuato usando l’operatore $sum all’interno della finestra di documenti definito da un limite inferiore (in questo caso non limitato) e un limite superiore (nell’esempio il documento corrente).

La descrizione dei vari parametri di questo stage con relativi esempi la potete trovare nella documentazione ufficiale.

Nuova Shell MongoDB: mongosh

Dalla versione 5 di MongoDB la shell mongo è deprecata e viene sostituita da mongosh. La nuova shell offre numerosi vantaggi rispetto alla versione precedente, tra cui:

  • Evidenziazione della sintassi migliorata.
  • Storia dei comandi migliorata.
  • Registrazione migliorata.

Nella prima release mongosh supporta solo un sottoinsieme dei metodi della shell mongo. L’elenco completo dei metodi attualmente supportati sono descritti nel dettaglio nella documentazione ufficiale. Inoltre, per mantenere la compatibilità all’indietro, i metodi che mongosh supporta usano la stessa sintassi dei metodi corrispondenti nella shell mongo.

Conclusioni

MongoDB 5 è un ulteriore passo in avanti di questo database NoSQL. Con l’introduzione delle collezioni delle serie temporali la sua applicazione all’IOT diventa molto più semplice. Esistono anche altre nuove funzionalità/modifiche oltre a quelle descritte in precedenza che migliorano le performance e le potenzialità del DBMS. Potete trovare l’elenco completo delle novità nelle Release Notes.

Letture consigliate

More To Explore

Intelligenza artificiale

AI: creare un chatbot con i propri dati

ChatGPT ci permette di avere un assistente virtuale a nostra completa disposizione. Ha però una grande limitazione: non conosce i nostri dati privati. Come possiamo costruirci un nostro assistente virtuale, o meglio un chabot, che usi i nostri dati e che non ci richieda investimenti di denaro? Scopriamo come costruirne uno usando LLM open, ambienti computazionali gratuiti come Colab e librerie Python per gestire file PDF e creare interfacce web semplici ed intuitive.

UX/UI

UX/UI design: applicazioni utili

Con Figma il compito di progettare siti web e/o applicazioni è stato notevolmente semplificato. In pochi click si possono ottenere degli ottimi risultati subito pronti da presentare agli stakeholder e/o agli sviluppatori. Tuttavia, Figma non è il solo strumento che si può usare! Scopriremo quali altri strumenti possono essere integrati nel lavoro di progettazione delle interfacce utente.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Design with MongoDB

Design with MongoDB!!!

Buy the new book that will help you to use MongoDB correctly for your applications. Available now on Amazon!