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.

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.

Struttura base di json

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.

Python e MongoDB, Json object

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.

Json array
Esempio di Json Object

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.

Python e MongoDB, Documenti

Un documento in MongoDB ci consente di archiviare una struttura dati espressa in BSON. Questo è l’elemento più importante.

Documento

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

Python e MongoDB, Documento

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.

Collection

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.

Documento
Database

INSTALLIAMO MONGODB E PYMONGO

Andiamo con il nostro Browser all’indirizzo www.mongodb.com. Nelle figure sotto riportate sono illustrati i passaggi di installazione.

Installazione MongoDb
Installazione MongoDb

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)

PYTHON E MONGODB – LINK AL CODICE GITHUB

GITHUB

PYTHON E MONGODB – LINK AI POST PRECEDENTI

PREVIOUS POST LINKS