Tutorial > Primi passi con il database MongoDB

Primi passi con il database MongoDB

Pubblicato il: 02 febbraio 2021

Database Sviluppo

Introduzione

All'interno di questa guida, ti verranno presentati i principali comandi con cui poter gestire un database costruito con MongoDB, destinato alla gestione di applicazioni ad alte prestazioni e sul cloud.

MongoDB è un database open source di tipo NoSQL orientato ai documenti, che differisce per questo dai classici database di tipo relazionale, come la sua alternativa SQL. MongoDB non memorizza infatti i dati in tabelle con determinati campi uniformi, ma permette di salvare i record come un documento in cui possono essere aggiunti tutti i campi desiderati di qualsiasi lunghezza.

Il tutorial si baserà sull'interazione con il database attraverso i comandi della Mongo Shell ma, qualora fossi interessato, sono disponibili altre sintassi in base alle differenti edizioni.

Controllare il Database in uso e cambiarlo

All'interno della shell, ti basterà digitare db per ricevere in output il nome del database attualmente in uso.

Con il comando use combinato al nome del database che vuoi utilizzare, il database in uso verrà cambiato.

Inserimento, aggiornamento e cancellazione di dati nel Database

Inserire un documento

Un primo passo per registrare dei dati è quello di inserire un nuovo documento nel tuo Database.

L'istruzione che puoi utilizzare per questo scopo è:

db.collection.insertOne()

All'interno della voce collection, dovrai specificare il nome della collezione (se non esiste, verrà creata) in cui vuoi inserire il nuovo documento.

Per mostrarti un esempio, immagina di avere un database che raccoglie informazioni su brani musicali e di volerne aggiungere alcuni a una collezione di brani preferiti:

db.preferiti.insertOne(
{ titolo: "Luna", artista: "Clementino", album: "Tarantelle", anno: 2015, tags: ["rap","hiphop"] durata: {m:3, s:25}})

La voce insertOne() restituisce un documento con un nuovo campo id, inserito in automatico da MongoDB.

Nota bene: nella specifica dei valori dei campi, puoi notare come in tags sia stata aperta una parentesi quadra inserendo poi diversi valori. La sintassi che vedi serve a definire un valore di un campo con un array. In questo caso, si parla dei generi con cui viene identificato il brano.

Per richiamare il documento, puoi usare il comando find, come in esempio:

db.preferiti.find({titolo: "Luna"})

Ti è possibile anche eseguire più inserimenti con un solo comando, utilizzando la dicitura insert.Many :

db.preferiti.insertOne(
{ titolo: "Luna", artista: "Clementino", album: "Tarantelle", anno: 2015, tags: ["rap"] durata: {m:3, s:25}}

{ titolo: "Breed", artista: "Nirvana", album: "Nevermind", anno: 1991, tags: ["grunge"] durata: {m:3, s:04}}

{ titolo: "The Boss", artista: "James Brown", album: "Black Caesar", anno: 1973, tags: ["funk"] durata: {m:3, s:15}}
)

Per richiamare i documenti appena inseriti, potrai usare una istruzione simile alla prima, ma senza specificare i valori dei campi:

db.preferiti.find({})

Aggiornare informazioni dei documenti

Può capitare che tu abbia bisogno di aggiornare o rimpiazzare alcune informazioni di entità registrate nel database. Ci sono diversi metodi che consentono di manipolare i dati già presenti e apportare delle modifiche.

Uno dei metodi più utilizzati è l'uso dell'operatore $set, che consente di cambiare il valore di un campo e, nel caso tale campo non esista nel documento, di crearne uno nuovo con il valore specificato. Vediamo un paio di operatori nell'esempio:

db.preferiti.updateOne(
   { titolo: "The Boss" },
   {
     $set: { tags: ["boogie"]},
     $currentDate: { aggiunto: true }
   }
)

Come potrai notare, la prima voce che compare è updateOne, che consente di aggiornare le informazioni di un singolo documento. A seguire:

  • La riga {titolo: "The Boss"} specifica quale campo e valore ricercare per selezionare il documento da modificare
  • L'operatore $set: specifica di cambiare il valore del campo tags con ["boogie"]
  • L'operatore $currentDate aggiungerà al campo aggiunto il valore della data corrente e, se tale campo non è stato specificato nella creazione dell'oggetto, verrà creato dall'operatore.

E' possibile anche effettuare un aggiornamento di più documenti tramite la dicitura update.Many:

db.preferiti.updateMany(
   { tags:["grunge"] },
   {
     $set: { tags:["rock"]},
   }
)

Nell'esempio, il comando aggiornerà tutti i documenti aventi tags uguale a ["grunge"], inserendo il nuovo valore ["rock"]

L'ultimo comando che ti sarà utile conoscere è il replace.One, che ti permetterà di cambiare tutti i campi e valori del documento a eccezione del suo id.

La particolarità del comando sta nel non dover usare alcun operatore ma nel dover limitarsi a immettere i nuovi campi e valori. Vedi l'esempio:

db.inventory.replaceOne(
{ titolo: "Luna"},
{ titolo: "Kalimba de Luna", artista: "Tony Esposito", album: "Kalimba de Luna", anno: 1997, tags: ["pop"] durata: {m:5, s:12}}

)

Nell'esempio, l'istruzione di replace è stata effettuata inserendo i nuovi valori nei campi già esistenti dell'elemento con titolo Luna.

Cancellare uno o più documenti

Se necessario, MongoDB ti offre dei comandi per cancellare uno o più documenti dal DB, in base anche a dei criteri di filtro.

Il primo comando che ti viene presentato è:

db.preferiti.deleteMany({})

Se usato senza specifiche, il comando deleteMany cancellerà tutti i documenti nella collezione preferiti.

La stessa istruzione può essere applicata con un filtro sugli elementi da cancellare.

db.preferiti.deleteMany(
{ anno: 2018 }
)
db.preferiti.deleteMany(
{ "anno": { $lt: 2018 } }
)

Gli esempi di sopra, rispettivamente, effettuano:

  1. Cancellazione di tutti i brani del 2018
  2. Cancellazione di tutti i brani di anni inferiori al 2018

L'ultima variante è quella della cancellazione di un solo elemento che corrisponda a un filtro applicato sui campi.

db.preferiti.deleteOne( 
	{ artista: "Clementino" } 
	)

In questo caso è stato cancellato il primo brano dell'artista Clementino all'interno della collezione.

Estrapolare dati dal database

Selezionare tutti i documenti

Nel momento in cui tu desideri selezionare tutti i documenti, puoi usare un'istruzione che chieda di estrapolare tutti i documenti in una specifica collezione di un db:

db.preferiti.find( {} )

In questo caso, vengono richiesti al db tutti i dati della collezione preferiti.

Operatori di confronto

É possibile usare degli operatori per filtrare solo i documenti che abbiano dei campi con un determinato valore.

Per far ciò, si riutilizza l'istruzione find, specificando altre condizioni.

db.preferiti.find( {tags: ["rap"]} )
db.preferiti.find({titolo: "Luna"})

Negli esempi mostrati sopra, i comandi servono rispettivamente a:

  1. Richiamare tutti i documenti (i tuoi brani preferiti) che abbiano tra i tags [rap];
  2. Richiamare il documento con titolo Luna.

Operatori di query

All'interno di un filtro, puoi anche specificare alcuni operatori di query per specificare altre condizioni nella tua ricerca.

Nel caso in cui volessi confrontare il valore di uno stesso campo con più valori, puoi utilizzare l'operatore $in.

db.preferiti.find({titolo: { $in: ["Luna","Kalimba"]}})

Con questo comando, per esempio, chiederai al db di fornirti in output i documenti che abbiano nel titolo la parola Luna o la parola Kalimba.

Concatenare più filtri tramite AND

In MongoDB è possibile utilizzare gli operatori logici.

Per usare l'operatore AND, basta usare delle virgole per separare i controlli che vogliamo concatenare:

db.preferiti.find( { artista: "Nirvana", anno: { $lt: 1995 } } )

Nell'esempio qui sopra, si chiede al database di restituire i documenti dalla collezione preferiti che abbiano come artista i Nirvana e che siano di un anno precedente al 1995.

La sintassi $lt indica l'operatore lower than, uno degli operatori di confronto utilizzabili con MongoDB.

Filtrare per diverse alternative con l'operatore OR

E' possibile usare anche l'operatore logico OR tramite il comando $or.

Riprendendo la riga di comando di prima:

db.preferiti.find( { $or: [ { artista: "Nirvana"},{ anno: { $lt: 1995 } } ] } )

La query estrapola un documento che abbia come artista Nirvana o che sia di un anno inferiore al 1995.

Combinare AND e OR

Ti presentiamo un esempio di comando in cui vengono combinati gli AND e gli OR, per permetterti di  comprendere meglio una possibile sintassi di applicazione di filtri più complessi.

db.preferiti.find( { 
tags: ["rock"],	
$or: [ { artista: "Nirvana"},{ anno: { $lt: 1995 } } ] } )

La query dovrebbe selezionare un brano rock che sia anche dei Nirvana o precedente al 1995.

Aggregare i dati

Le operazioni di aggregazione dei dati si basano sugli operatori $match e $group, richiamati dal comando aggregate.

Sostanzialmente, l'operatore $match applica un filtro ai documenti in base al valore del campo richiesto e li da in output in ordine.

L'operatore $group, invece, aggrega i dati in base ai campi richiesti nelle specifiche della sintassi.

Ti mostriamo subito un esempio, per toccare con mano il loro funzionamento:

db.preferiti.aggregate([
   { $match: {  tags: ["rap"] } },
   { $group: { annata: "$anno", n_brani_usciti: { $sum: 1 } } }
])

In questo codice l'operatore $match filtra e ordina tutti i brani che contengono nei loro tags la voce rap. Successivamente, $group raggruppa tutti i brani dello stesso anno e ne conta il numero sommando, per ogni oggetto simile aggregato, il valore 1 al campo n_brani_usciti.

In linguaggio naturale, il comando chiede di raggruppare tutti i preferiti di categoria rap per anno di uscita e contare il numero di brani di quel genere usciti in quell'anno.

Conclusioni

Al termine di questa guida, dovresti essere in grado di utilizzare i comandi più basilari della shell di MongoDB  e di comprendere i diversi tipi di operazioni effettuabili per inserire, manipolare o richiedere dati al DB.

Essendo il database MongoDB in continuo aggiornamento, ti suggeriamo di esplorare l'uso di altri operatori e funzioni sulla documentazione ufficiale di MongoDB.