MongoDB Compass – interrogare e analizzare in modo semplice un database NoSQL

MongoDB Compass
Una guida per utilizzare MongoDB Compass per esercitarsi. Alcuni esempi ed errori da evitare durante la scrittura di query in MongoDB.

Share

Reading time: 8 minutes

In questa guida guida sulle query più comuni in MongoDB utilizzeremo i dataset di esempio forniti all’interno dell’installazione di MongoDB Atlas. Trovate tutti i riferimenti su come creare un account gratuito su MongoDB Atlas, configurare un cluster e caricare i database per esercitarvi in questo articolo.

Connessione al cluster

Per prima cosa bisogna decidere il metodo di connessione al cluster di MongoDB Atlas. Cliccando sul pulsante CONNECTIONS si aprirà un popup per scegliere la metodologia di connessione al cluster. Le possibili scelte sono:

  • utilizzo della shell di MongoDB
  • connessione di un applicazione mediante i driver nativi di MongoDB
  • utilizzo di MongoDB Compass

 

Schermata 2020-12-05 alle 19.17.54

In base alla scelta effettuata il popup mostrerà alcune informazioni base per creare una connessione sicura al cluster. In particolare, se si vuole utilizzare la shell o MongoDB Compass verrà indicato come installare il software necessario in base al sistema operativo che stiamo utilizzando o che scegliamo. In tutti i casi verrà fornita la stringa di connessione da copiare. Bisognerà solo sostituire le credenziali di autenticazione. Nel caso di un linguaggio di programmazione è possibile anche visualizzare un esempio di codice per effettuare la connessione al database. Di seguito sono riportate le schermate relative a ciascun metodo di connessione.

In questa guida andremo ad utilizzare MongoDB Compass anche per valutare alcune funzionalità che questo ambiente fornisce.

L’interfaccia di MongoDB Compass

MongoBD Compass è il software standalone fornito da MongoDB per gestire e interrogare i database NoSQL di MongoDB. Ovviamente non è possibile creare un applicazione che lo inglobi, ma può essere molto utile per estrarre i dati, creare indici, analizzare lo schema delle collezioni e gestire la validazione dei documenti. 

Non appena si apre MongoDB Compass viene mostrata un’interfaccia per definire la connessione. Per connettersi al cluster di MongoDB Atlas è sufficiente inserire la stringa di connessione fornita nel passo precedente, opportunamente modificata con le credenziali di accesso.

Schermata 2020-12-05 alle 19.41.30

E’ possibile anche inserire le varie opzioni di connessione mediante un form apposito cliccando sul link “Fill in connection fields individually”. Una volta stabilita la connessione verrà mostrato l’elenco dei database disponibili nell’installazione di MongoDB. Se avete seguito il tutorial mostrato nell’articolo MongoDB Atlas – creazione di un ambiente cloud per esercitarsi troverete tutti i database di esempio forniti da MongoDB Atlas.

Schermata 2020-12-05 alle 19.44.36

Per ogni database viene mostrato, oltre al nome, lo spazio su disco utilizzato, il numero di collezioni e di indici. E’ possibile eliminare un database semplicemente cliccando sull’icona del cestino vicino a ciascun database.

Se si seleziona una collezione di un database dalla lista presente nella parte sinistra della videata, si aprirà, nella parte destra,  la visualizzazione dei documenti. Questa schermata fornisce un’anteprima di alcuni documenti contenuti nella collezione e può essere usata anche per scrivere le query di interrogazione. 

Schermata 2020-12-06 alle 16.05.30

La visualizzazione di default è quella della lista. Se sono presenti strutture complesse all’interno di un documento (embedded documents, array) è possibile espanderli per visualizzare i dati presenti. Le altre visualizzazioni sono il JSON (disponibile dalla versione 1.2) e quella tabulare. Per ogni documento visualizzato, è possibile modificarlo, copiarlo nella propria clipboard, duplicarlo e cancellarlo mediante gli appositi tasti sulla destra associati a ciascun documento.

Come detto in precedenza, questa schermata può essere utilizzata per interrogare le collezioni. E’ possibile infatti inserire filtri, proiezioni, condizioni di sort e di limitazione del numero dei record restituiti. Per inserire tutte queste opzioni è sufficiente espandere il form di inserimento cliccando sul tasto OPTIONS.

Le funzionalità molto utili del form di interrogazione sono il completamento automatico e la validazione della sintassi. Durante la digitazione, infatti, MongoDB Compass suggerirà i campi e gli operatori che potrebbero essere utili per comporre la query. Inoltre, se c’è qualche errore di sintassi il badge a fianco del campo del form avrà uno sfondo di colore rosso. 

Schermata 2020-12-06 alle 16.29.49

Il secondo menù è relativo alle aggregation pipeline e viene utilizzato per le query più complesse che necessitano di operazioni di trasformazione dei dati presenti nei documenti.

Il menù Schema serve per analizzare lo schema dei dati presenti nella collezione e recuperare alcune statistiche relative alla distribuzione dei dati. Successivamente vedremo come sfruttarlo per comprendere quali query possono restituire risultati di interesse.

Gli altri 3 menù (Explain Plan, Indexes e Validation) non verranno utilizzati in questo tutorial, ma servono, come si evince dai loro nomi, rispettivamente per analizzare il piano di esecuzione di una query, gestire gli indici e inserire regole di validazione per i documenti immagazzinati nella collezione.

Infine, nella parte alta di destra della schermata vengono sempre visualizzate alcune informazioni sul numero di commenti salvati, lo spazio occupato sia dalla collezione che mediamente da ciascun documento. Sono anche riportate le informazioni relative agli indici definiti per la collezione selezionata.

Interrogare campi testuali

Si supponga di voler estrarre tutte le proprietà di tipo “House” dal database di AirBnB. In questo caso è possibile semplicemente impostare un filtro sul campo property_type che sia uguale al valore richiesto. La query finale sarà pertanto la seguente:

db.listingsAndReviews.find({property_type:"House"}) 

In MongoDB Compass basta riportare semplicemente la condizione di filtraggio nell’apposito campo indicato dal tag FILTER. In caso di errori di sintassi l’etichetta diventerà di colore rosso.

Nel caso sia necessario definire quali campi devono essere visualizzati, ordinare il risultato o limitare il numero di documenti restituiti è necessario cliccare sul bottone OPTIONS per inserire questi vincoli.

L’ordine con cui vengono restituiti i documenti dipende da come vengono letti da disco. Se si volesse specificare un ordinamento diverso è necessario inserire l’opzione SORT. Anche in questo caso si richiede di inserire un documento che contiene i campi su cui effettuare l’ordinamento. Per esempio se si volesse ordinare il risultato della query precedente in base al prezzo crescente è sufficiente indicare la seguente condizione:

{price:1} 

Il valore 1 indica un ordinamento ascendente, mentre -1 discendente.
Se si volesse ordinare anche in base alla data della dell’ultima recensione la condizione risulterebbe la seguente:

{price:1, last_review:-1} 

Come si può notare i due campi vengono ordinati in ordine differente.

Attenzione

Quando l'ordinamento si basa su più attributi, l'ordine è importante. Infatti, il primo attributo indica l'ordinamento primario, mentre i successivi vengono usati solo in caso di parità di valore dell'insieme degli attributi precedenti.

Interrogare campi numerici

Per i campi numerici di solito si utilizzano gli operatori di confronto per definire un intervallo desiderato. Si supponga si voler estrarre le proprietà che hanno ricevuto più di 100 recensioni. Il modello utilizzato per questi documenti è basato su quello precalcolato (trovate maggiori informazioni in questo libro). Di conseguenza, è stato definito un campo number_of_reviews che indica il numero totale di recensioni ricevute senza dover effettuare il conteggio degli elementi presenti nel vettore reviews. Grazie a questo modello è possibile rispondere alla richiesta precedente in modo efficiente semplicemente utilizzando l’operatore di confronto $gt.

db.listingsAndReviews.find ( {number_of_reviews: {$gt: 100 } }) 

Ovviamente è possibile definire degli intervalli per lo stesso attributo numerico. Ad esempio, se si volesse estrarre estrarre tutte le proprietà che hanno in dotazione 3 o 4 letti, è possibile utilizzare in combinazione gli operatori $gt and $lt come di seguito:

db.listingsAndReviews.find ({beds: {$gt: 2, $lt:5 } }) 

La lista esaustiva degli operatori di confronto è disponibile sulla guida ufficiale.

Interrogare un array di stringhe

In ciascun documento del database di AirBnB sono riportati i servizi che sono disponibili in ciascuna proprietà. Questa informazione è salvata in un vettore di stringhe chiamato amenities. Lo scenario più classico è quello di estrarre ad esempio tutte le proprietà che forniscono il Wifi. In questo caso basta porre una condizione di uguaglianza per il campo di tipo array. La query risultante sarà pertanto la seguente:

db.listingsAndReviews.find ({amenities:"Wifi"}) 

Bisogna fare attenzione però quando si vuole trovare tutte le proprietà che forniscono due servizi come ad esempio Wifi e Dryer. Si supponga di usare le seguente query:

db.listingsAndReviews.find ({ amenities: ["Wifi", "Dryer"] }) 

Il risultato non sarà quello desiderato. La query restituirà un insieme vuoto poiché non esiste nessun documento della collezione che contenga solo questi due servizi per l’attributo amenities. Un’idea potrebbe essere quella di usare l’operatore $in come riportato di seguito.

db.listingsAndReviews.find ({ amenities: {$in: ["Wifi", "Dryer"] } }) 

Anche in questo caso il risultato non sarà quello desiderato. Infatti, verranno restituite tutte le proprietà che contengono almeno uno dei due servizi indicati nell’operatore $in. Come quindi è possibile specificare la coesistenza di entrambi i servizi? Bisogna utilizzare l’operatore $all:

db.listingsAndReviews.find ({ amenities: {$all: ["Wifi", "Dryer"] } }) 

Nel caso invece le condizioni siano relative a campi diversi è sufficiente mettere in AND i due campi. Ad esempio, se si utilizza il database Mflix e più precisamente la collezione movies, è possibile individuare i film di tipo western in lingua italiana semplicemente con la query seguente:

db.movies.find({genres:"Western", languages:"Italian"}) 

Attenzione

I valori delle stringhe sono case sensitive quindi fate attenzione alle maiuscole e minuscole.

Interrogare embedded documents

In molti casi le informazioni che vengono salavate hanno strutture complesse. Pertanto, si utilizzano modelli basati su embedded documents. Le interrogazioni che devono filtrare i dati in base a valori specifici su queste strutture non sono molto diverse dalle query finora viste.

Si supponga di voler estrarre tutti i film che hanno una valutazione imdb maggiore di 8.5, ossia film che sono reputati dalla critica come ottimi film o grandi classici. La query finale sarà

db.movies.find({"imdb.rating": {$gt: 8.5 }}) 

Attenzione

Per accedere ai campi di un embedded document è necessario usare la dot notation, ma sopratutto racchiudere con le " tutto il path dell'attributo desiderato.

La profondità della struttura del documento non inficia sulla difficoltà di interrogazione. Supponiamo di voler estrarre tutti i cinema che si trovano nello stato della California (CA). Utilizzando la collezione theaters possiamo recuperare questa informazione accedendo al campo state dell’embedded document address a sua volta contenuto nel campo location. La query risulterà la seguente:

db.theaters.find({"location.address.state": "CA" }) 

Interrogare dati geografici

Una delle caratteristiche di MongoDB che lo rende una delle soluzioni tecnologiche più affascinanti da parte degli utilizzatori è la possibilità di salvare all’interno di un documento coordinate geospaziali e interrogarle semplicemente costruendo un indice su di esse. Non è necessario quindi installare plugin, estensioni o altro software per creare un database geospaziale.

Nei database di esempio caricati su MongoDB Atlas gli indici spaziali vengono creati al momento della creazione dei database. Ad esempio, nella collezione shipwrecks del database sample_geospatial è presente un indice geospaziale sul campo coordinates. E’ possibile verificare la sua presenza andando nel menù Indexes di MongoDB Compass. 

Schermata 2020-12-06 alle 17.38.59

Se si volesse creare, nel caso accidentalmente non fosse presente o venisse cancellato, basta digitare il seguente comando:

db.shipwrecks.createIndex({coordinates: "2dsphere"}) 

Il database che si sta analizzando è relativo ai relitti di navi ed è stato costruito apposta per familiarizzare con l’utilizzo dei dati geospaziali. Poiché i relitti delle navi non sono presenti in tutto il mondo, andare a definire esattamente una zona di interesse potrebbe non essere così semplice. Per questo motivo, il consiglio è di utilizzare il menu Schema per analizzare la distribuzione dei dati. 

Schermata 2020-12-06 alle 17.44.49

Cliccando sul pulsante in alto a destra ANALYZE  o su quello centrale della schermata Analyze Schema, vedremo comparire dopo qualche secondo una serie di informazioni per ciascun campo dei documenti contenuti nella collezione.

A seconda della tipologia della distribuzione dei dati la visualizzazione può essere differente. Se il campo assume tipologie di verso di dato come ad esempio string, double e int, possiamo cambiare la visualizzazione selezionando la tipologia di interesse. In questo modo è possibile capire quali sono i valori possibili di un campo e quanto sono frequenti.

La rappresentazione più interessante è quella dei campi geospaziali, ossia su quelli che è stato definito un indice di tale tipologia. In questo caso, ogni documento viene rappresentato su una mappa che è possibile navigare. La funzione più utile però è la possibilità di definire una zona di interesse usando i comandi in alto a destra della mappa.

MongoDB Compass: visualizzazione dati geografici

Non appena l’area viene disegnata, MongoDB Compass riporta la condizione di filtraggio nel campo FILTER in alto. Questo permette quindi di filtrare in modo opportuno i documenti di nostro interesse, ma anche di effettuare un’ulteriore analisi sulla distribuzione dei dati solo del sottoinsieme selezionato.

Di seguito è riportato un esempio di filtro ottenuto utilizzando la creazione di un’area di interesse circolare.

{coordinates: {$geoWithin:
    { $centerSphere: [ 
        [ -80.79224357496888, 27.574472392552394 ], 
        0.0903922119472032 ]}
    }
} 

Per interrogare i dati geografici è possibile utilizzare anche altri operatori. Potete trovare una lista completa nella guida ufficiale.

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!