PYTHON E MONGODB
Iniziamo a parlare di “Python e MongoDB“. Il modello tradizionale per rappresentare i dati in un database è il modello relazionale. Noi in questo articolo prenderemo in esempio un nuovo modello di rappresentazione dei dati che non usa il modello relazionale e il linguaggio SQL per interrogarlo ma un approccio totalmente diverso basato su MongoDB.
JSON
JSON (Javascript Object Notation) è un formato di rappresentazione e interscambio dati leggero. È basato su un sottoinsieme del linguaggio di programmazione javascript. JSON è costruito a partire da due strutture di base, praticamente presenti in tutti i linguaggi di programmazione, e cioè gli oggetti e gli array. Gli oggetti sono delle collezioni e associazioni tra nomi e valori, più precisamente chiavi e valori come accade in Python con i dizionari. Gli array sono invece delle liste ordinate di valori, basta pensare alle liste in Python.
PYTHON E MONGODB – RAPPRESENTAZIONE DI UN OGGETTO JSON
La rappresentazione di un oggetto JSON inizia con una parentesi graffa aperta e termina con una parentesi graffa chiusa. La chiave o il nome è costituito sempre da una stringa separata dal valore con il simbolo di due punti. Se sono presenti più elementi ogni coppia chiave valore va separata con una virgola. I value sono anche quelli presenti in javascript e sono evidenziati in figura.
Nell’immagine sotto riportata puoi vedere due oggetti rappresentati in JSON di cui il secondo nidificato. Il secondo oggetto assomiglia più a un array di elementi, per cui occupiamoci ora degli array.
PYTHON E MONGODB – ARRAY IN JSON
Un array in JSON inizia con una parentesi quadra aperta e termina con una parentesi quadra chiusa. Se ci sono più valori questi devono essere separati da virgola.
BSON
BSON (Binary JSON) è una forma di serializzazione codificata in formato binario di documenti simili a JSON. BSON aggiunge delle estensioni che ci consentono di realizzare altri Data Types. Un tipo molto importante è ObjectId che rappresenta un identificatore univoco in MongoDB ed è fondamentale per andare a rappresentare i dati. BSON serve principalmente a due scopi in MongoDB. Per prima cosa è il formato in cui i dati vengono archiviati all’interno di un database MongoDB. Secondariamente è un formato di interscambio ad esempio quando eseguiamo una query su MongoDB. Sia l’archiviazione sia l’interscambio avvengono in forma binaria.
DOCUMENTI E COLLEZIONI
All’interno di un database relazionale i dati vengono memorizzati in tabelle, all’interno delle quali ci sono i record costituiti da dati che servono a definire una particolare informazione. In prima approssimazione possiamo dire che un record all’interno di un database relazionale corrisponde a un documento in MongoDB. Un insieme di documenti vengono mantenuti in una collezione che in modo molto parziale corrisponde all’idea di tabella nel mondo relazionale.
Un documento in MongoDB ci consente di archiviare una struttura dati espressa in BSON. Questo è l’elemento più importante.
PYTHON E MONGODB – ESEMPIO DI DOCUMENTO
Per fare un primo esempio noi possiamo archiviare in un documento le informazioni relative a una persona. Tutti i documenti all’interni di MongoDB devono avere una proprietà _id che si chiama sempre in questo modo e che stabilisce l’univocità del documento all’interno della sua collezione. Ha lo stesso scopo della chiave primaria di un database relazionale. Possiamo generarne uno noi oppure lasciare a MongoDB il compito di crearlo. Il tipo di dati di un _id è ObjectId
Se vogliamo fare un’analogia con il mondo relazionale possiamo dire che tutte le proprietà in MongoDB dovrebbero essere sempre le stesse all’interno di una collection di documenti, in realtà MongoDB è molto più flessibile, nel senso che le proprietà dei documenti possono essere completamente diverse. Nulla ci vieta di inserire una struttura diversa nei documenti di una collection. Questo accade perché a differenza del mondo relazionale non vi è una struttura a cui siamo vincolati. Va però detta una cosa. Non è detto che questa sia una buona soluzione. Ciò può rappresentare un caos quando andiamo a prelevare le informazioni.
Un documento può avere una struttura gerarchica come visto in JSON e contenere Array di dati. In conclusione MongoDB ci permette di archiviare i dati in una forma molto più flessibile rispetto a un DBMS.
INSTALLIAMO MONGODB E PYMONGO
Andiamo con il nostro Browser all’indirizzo www.mongodb.com. Nelle figure sotto riportate sono illustrati i passaggi di installazione.
Io sto usando Windows 11 e l’installazione di MongoDB installa anche MongoDBCompass un editor visuale. Sotto Windows il servizio di database viene avviato automaticamente, se hai un altro sistema operativo fai riferimento alla documentazione di MongoDB. Per installare pymongo apri il terminale e digita: pip3 install pymongo se hai correttamente impostato le variabili di ambiente non dovresti avere problemi.
CODICE DI ESEMPIO
import pymongo from pymongo import MongoClient #eseguo la connessione a mongodb client = MongoClient("localhost",27017) #creo un database e lo chiamo testdb db=client.testdb #creo la collection persone persone_coll = db.persone persone_coll.create_index([("nome",pymongo.ASCENDING)]) persone_coll.create_index([("cognome",pymongo.ASCENDING)]) persone_coll.create_index([("computer",pymongo.ASCENDING)]) #creo un documento p1 = {"Nome":"Mario","Cognome":"Rossi","Eta":30, "Computer":["Apple","Asus"]} #inserisco il documento in mongodb persone_coll.insert_one(p1) #creo un documento p2 = {"Nome":"Giuseppe","Cognome":"Verdi","Eta":45, "Computer":["Apple"]} #inserisco il documento in mongodb persone_coll.insert_one(p2)
import pymongo from pymongo import MongoClient #eseguo la connessione a mongodb client = MongoClient("localhost",27017) #accedo al database db=client.testdb #accedo alla collection persone persone_coll = db.persone p=persone_coll.find_one() persone = persone_coll.find({"Computer":"Asus"}) for p in persone: print(p) print('**************') #Update operatore $set result = persone_coll.update_one({"Nome":"Giuseppe"},{"$set":{"Eta":50}}) p=persone_coll.find_one({"Nome":"Giuseppe"}) print(p) print('************************') #$gt=Greater Than (Maggiore o Uguale) operatore $gt persona = persone_coll.find_one({"Nome":{"$gt":"Giuseppe"}}) print(persona)
Lascia un commento