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"}}
);
Continua a imparare
- Questa era l’ultima lezione del mio approfondimento su NoSQL! Visita la sezione del blog di statistica
- Il mio video corso completo di 50+ ore per Data Analyst: https://www.yimp.it/corso-data-analysis/
- Torna all’indice delle lezioni