Esercizi e query su MongoDB con soluzioni

esercizi mongodb

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

Torna in alto
Torna su