In questa pagina riporto una serie di esercizi con soluzioni su MongoDB che richiedono la scrittura di query (interrogazioni) sul più famoso database non relazionale. Ho riportato quando possibile anche la relativa query SQL così avrai modo di confrontare i due linguaggi, tenendo sempre presente che i dati sono organizzati in strutture differenti: collezioni (collection) di documenti JSON per MongoDb e tabelle per i database relazionali.
Query su MongoDB per filtrare i dati di una collection
1) Dalle Collection dei Clienti, estrarre nome e cognome dei clienti residenti in Lombardia
db.Clienti.find( {"RegioneResidenza":"Lombardia" }, {"Nome" :true, "Cognome":true, "_id" :false });
SELECT Nome, Cognome FROM Clienti WHERE RegioneResidenza = 'Lombardia';
2) Dalle Collection dei Clienti, estrarre nome e cognome dei clienti residenti in Lombardia o in Campania
db.Clienti.find( {"RegioneResidenza":{ $in:["Lombardia", "Campania"] } }, {"Nome" :true, "Cognome":true, "_id" :false });
SELECT Nome, Cognome FROM Clienti WHERE RegioneResidenza IN ('Lombardia','Campania');
3) Dalla Collection dei Clienti, estrarre i clienti che hanno la chiave FlagUe.
ATTENZIONE: con il prossimo codice precedente estraggo anche i documenti dove la chiave FlagUe è presente ma è null.
db.Clienti.find( {"FlagUE":{$exists:true} });
Se voglio estrarre soltanto i documenti dove FlagUE è valorizzato e diverso da NULL dovrò scrivere
db.Clienti.find( {"FlagUE":{$ne:null} });
4) Dalla Collection dei Clienti, estrarre i clienti con data di nascita nel 2018
db.Clienti.find( { $expr: { $eq: [{$year:{$toDate: "$DataNascita"}}, 1982 ] } });
SELECT * FROM Clienti WHERE YEAR(DataNascita) = 1982;
Query per aggregare i dati di una collection
1) Contare il numero di fatture associate a ciascun “Numero fornitore”.
db.Fatture.aggregate( [{$group:{ "_id":" $NumeroFornitore", "Conteggio":{$sum:1} } } ]);
SELECT NumeroFornitore, COUNT(*) AS Conteggio FROM Fatture GROUP BY NumeroFornitore;
2) Sommare gli importi delle fatture divise per “Tipologia” e “Numero Fornitore”.
db.Fatture.aggregate( [{$group:{ "_id": {"Tipologia": "$Tipologia", "NumeroFornitore": "$NumeroFornitore" }, "ImportoTotale":{$sum: "$Importo"} } } ]);
SELECT Tipologia, NumeroFornitore, SUM(Importo) AS ImportoTotale FROM Fatture GROUP BY Tipologia, NumeroFornitore;
3) Filtrare i risultati dell’esercizio precedente visualizzando solo le coppie “Tipologia” e “Numero Fornitore” per le quali è presente più di due fatture.
db.Fatture.aggregate( [{$group:{ "_id": {"Tipologia": "$Tipologia", "NumeroFornitore": "$NumeroFornitore" }, "ImportoTotale":{$sum: "$Importo"}, "Conteggio" :{$sum:1} } }, {$match:{ "Conteggio":{$gt:2} } } ]);
SELECT Tipologia, NumeroFornitore, SUM(Importo) AS ImportoTotale FROM Fatture GROUP BY Tipologia, NumeroFornitore HAVING COUNT(*)>2;
Modificare i dati su MongoDb
1) Aggiungere alla Collection dei Clienti la chiave Nazione valorizzata con “Italia” nei documenti che non hanno la chiave FlagUe.
db.Clienti.updateMany( {"FlagUE":{$exists:false}}, {$set:{"Nazione":"Italia"}} );
2) Inserire un nuovo fornitore nella collection dei fornitori. Il nuovo documento devo avere almeno una chiave di tipo Array (ad esempio si potrebbe creare la chiave “RegioniDiConsegna”).
db.Fornitori.insertOne( {"NumeroFornitore":10, "RegioniAttive":["Puglia", "Lombardia"] });
3) Aggiungere un nuovo valore all’array creato nell’esercizio precedente.
db.Fornitori.updateOne( {"_id": ObjectId( "<valore precedente>")}, {$push:{"RegioniAttive": "Friuli"}} );
Video lezione sul formato JSON
Approfondiamo il formato JSON con una video lezione del mio canale Youtube
Corsi Correlati
- A questo link trovi il mio corso in diretta streaming di MongoDB
- Il mio video corso gratuito di introduzione a MongoDB
- Il mio video corso completo di analisi dei dati con MongoDB