In questa lezione impareremo ad utilizzare PyMongo, driver ufficiale per l'interfacciamento con MongoDB tramite il linguaggio di programmazione
. Partiremo dall'installazione, per poi capire come utilizzare questo strumento mediante qualche esempio pratico.
Installazione di PyMongo
Prima di affrontare l'installazione di PyMongo, è bene precisare che in questa sede daremo per scontata l'
e di MongoDB. La prima è stata ampiamente affrontata in un'
, mentre per l'
è sufficiente fare riferimento all'
.
Il modo più semplice per installare PyMongo è sfruttare le potenzialità di pip. Apriamo quindi il nostro terminale, e digitiamo il comando seguente:
pip install pymongo==3.4.0
Ciò dovrebbe scaricare ed installare automaticamente e senza problemi la versione 3.4.0 di PyMongo. Se qualcosa dovesse andare storto, è bene comunque fare riferimento alla
, disponibile sul sito ufficiale.
Possiamo subito verificare se l'installazione è andata a buon fine, semplicemente aprendo un terminale Python e digitando:
import pymongo
Se non ci viene mostrato alcun messaggio di errore, l'installazione è stata effettuata con successo, e possiamo procedere con l'uso di PyMongo.
Utilizzare PyMongo
Dopo l'import
, iniziamo subito con la prima operazione richiesta: la connessione al database. Come spesso capita su Python, il tutto si riduce ad appena due righe di codice (import
incluso):
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
Il primo parametro che accetta il costruttore della classe MongoClient
rappresenta l'indirizzo del DB, mentre il secondo parametro è la porta (27017 è quella standard utilizzata da MongoDB).
Effettuata la connessione, accediamo ora al database che vogliamo utilizzare. Supponiamo che il nostro database si chiami "test". Sfruttiamo la sintassi seguente:
db = client.test
o, in alternativa:
db = client["test"]
La variabile db
è quella che ci permetterà di agire sul database test
, rappresentato come proprietà dell'oggetto client
ottenuto come risultato della connessione.
Inserire documenti
Le operazione di inserimento di documenti all'interno del nostro database richiederà appena 2 linee di codice. La prima ci servirà per specificare in quale collection vogliamo inserire il nostro documento, mentre la seconda linea effettuerà concretamente l'inserimento, tramite il metodo insert_one()
. Ecco un semplice esempio chiarificatore:
collection = db.my_collection
doc = {
'title': 'Titolo',
'content': 'Contenuto di prova',
'author': 'HTML.it'
}
result = collection.insert_one(doc)
Se dobbiamo inserire più documenti in una volta, possiamo utilizzare il metodo insert_many()
, che risulta più performante dell'uso di più chiamate del metodo insert_one()
. Anche in questo caso, un esempio vale più di mille parole:
collection = db.my_collection
doc_1 = {
'title': 'Titolo1',
'content': 'Contenuto di prova1',
'author': 'HTML.it'
}
doc_1 = {
'title': 'Titolo2',
'content': 'Contenuto di prova2',
'author': 'HTML.it'
}
doc_1 = {
'title': 'Titolo3',
'content': 'Contenuto di prova3',
'author': 'HTML.it'
}
new_result = collection.insert_many([doc_1, doc_2, doc_3])
Accedere ai documenti
Per ottenere un documento, utilizzeremo stavolta il metodo find_one()
:
collection = db.my_collection
html_doc = collection.find_one({'author': 'HTML.it'})
print(html_doc)
L'output sarà simile al seguente:
{
'author': 'HTML.it',
'title': 'Titolo2',
'content': 'Contenuto di prova2',
'_id': ObjectId('584c4afdea542a766d254241')
}
Il parametro che abbiamo passato al metodo find_one()
viene utilizzato per ricercare tutti i documenti appartenenti alla collection che abbiano le proprietà in esso contenuto, e valorizzato come specificato. In questo caso, viene ritornato uno solo dei documenti il cui campo author esiste ed è valorizzato come HTML.it. Si noti la presenza del campo _id
, che come sappiamo viene assegnato automaticamente da MongoDB ad ogni documento.
Se volessimo invece ottenere tutti i documenti il cui campo author sia valorizzato come HTML.it, possiamo sfruttare (analogamente a quanto visto per l'inserimento) il metodo find()
:
collection = db.my_collection
html_docs = collection.find({'author': 'HTML.it'})
print(html_docs)
Questa volta, per accedere ai documenti ottenuti, dovremo sfruttare l'oggetto iterabile che ci viene ritornato dal metodo find()
. Possiamo farlo con un semplice ciclo for
:
for doc in html_docs:
print(doc)
Alternative a PyMongo
Sebbene PyMongo sia ben supportato, nonchè driver ufficiale di MongoDB, esistono diverse alternative per interagire con questo database tramite il linguaggio di programmazione Python. Una su tutte è
, che in realtà è una libreria che sfrutta PyMongo per rendere più di alto livello le interazione con il database. Sebbene non ci occuperemo in questa sede anche di MongoEngine, è bene essere consapevoli della sua esitenza, e preferirlo sopratutto in produzione, per progetti complessi e di grandi dimensioni.