Introduzione all'utilizzo di MongoDB in PHP

di Giuseppe Maggi - 16 novembre 2012

database MongoDB

Interazione PHP - MongoDB

Procediamo adesso con un esempio piuttosto basilare, finalizzato a trasformare in un programma PHP quanto precedentemente effettuato da riga di comando.

Per connetterci al database è necessario istanziare un oggetto della classe Mongo, passandogli una stringa contenente i parametri di connessione. Nel nostro caso, non avendo provvisto MongoDB di autenticazione, sarà sufficiente richiedere una connessione al servizio standard ossia localhost sulla porta 27017.

<?php
$conn = new Mongo("mongodb://localhost:27017");
$database = $conn->prova;
$collection = $database->candidati;

Nell'esempio la variabile $conn contiene la connessione attiva al DBMS. Da lì si ottiene un riferimento al database “prova” ($database è un oggetto di tipo MongoDB) e poi alla collection “candidati” ($collection è un oggetto di tipo MongoCollection). Come già detto, se il database o la collection non esistono ancora, MongoDB non restituisce alcun errore ma li crea automaticamente.

Come anticipato, MongoDB non adotta un linguaggio per le query simile all’SQL. Al suo posto dobbiamo utilizzare  i metodi dell’oggetto MongoCollection a cui passeremo degli array opportunamente configurati. Sarà poi il driver di Mongo a convertirli in comandi e strutture JSON, analoghi a quelli illustrati nelle operazioni da riga di comando.

Ecco un esempio di inserimento di un documento:

$documento = array (
     'nome' => "Ugo",
     'cognome' => "Rossi",
     'PHP' => 7,
     'Java' => 10,
     'inglese' => 7
);

$collection->insert($documento);

L’array $documento contiene i dati del signor Ugo Rossi da inserire nel database. Nel mondo relazionale costituirebbe un record di una tabella, in MongoDB invece costituisce un documento. Il metodo insert invocato sulla collection svolge il lavoro.

E’ estremamente importante fare attenzione al set di caratteri utilizzato dalle stringhe inserite in un documento. In tutte le funzioni di MongoDB va utilizzato l’UTF-8. Nel caso lo script realizzato non tratti stringhe in UTF-8 è possibile convertirli usando la funzione utf8_encode.

Per inserire un documento è possibile invocare, al posto del metodo insert, il metodo save nello stesso modo appena visto. A differenza del metodo insert, se il documento fosse stato precedentemente prelevato dal database, il metodo save avrebbe aggiornato il documento esistente. In altre parole il metodo insert corrisponde sempre ad un classico INSERT mentre il metodo save esegue un INSERT se il documento non esiste nel database, altrimenti un UPDATE.

Vediamo adesso uno degli aspetti più importanti dell'interazione con un database ossia il recupero dei dati. Iniziamo con una ricerca priva di filtri, finalizzata alla lettura di tutti i documenti presenti nella collection.

$cursore = $collection->find();

foreach($cursore as $documento) {
     echo $documento['nome'], ' ', $documento['cognome'], "\n";
}

Come è possibile desumere dal precedente esempio, il risultato dell’interrogazione, ovvero dell’invocazione del metodo find, è un cursore. Esso rappresenta un puntatore ai dati restituiti ed il suo movimento lungo il set di risultati, determinato dalle iterazioni del ciclo foreach, permetterà di accedere ad ogni singolo documento reperito. Questo infine può essere utilizzato come un normale array PHP per poterne trattare i risultati.

Vediamo adesso come effettuare una lettura dei documenti di una collection impiegando dei filtri. Ciò che nel mondo relazionale viene specificato nel corpo di una clausola WHERE di una query ora popola un array PHP da passare come parametro al metodo find().

Se ad esempio volessimo cercare i candidati di nome ‘Ugo’:

$query = array(
     'nome' => 'Ugo'
);

$cursore = $collection->find($query);

Oppure, per recuperare i documenti in cui il voto di PHP risulta minore di 8 si può impostare $query in questa maniera:

$query = array(
     'PHP' => array('$lt' => 8)
);

$cursore = $collection->find($query);

Quindi, in generale, i filtri di una query saranno specificati in un array che avrà come elementi i nomi dei campi da sottoporre a valutazione. Ad essi sono associate le condizioni da verificare. Gli operatori, come $lt che ha il significato di “minore di”, dovranno essere specificati come chiavi di un array a cui sarà associato l'operando di confronto.

Ovviamente esistono operatori in grado di descrivere ogni casistica, ad esempio $gte sta per “maggiore o uguale”, $gt per “maggiore”, ecc.. Si faccia attenzione all’utilizzo dei singoli apici per definire gli operatori. Questi infatti, avendo in testa il simbolo $, possono essere confusi da PHP come variabili e sostituiti con il loro valore se inseriti in stringhe definite con i doppi apici.

Il meccanismo di definizione delle condizioni appena visto può essere usato anche per effettuare aggiornamenti e cancellazioni in una collection.

Vediamo ad esempio come cancellare tutti i documenti dei candidati che conoscono il Python

$query = array(
     'Python' => array('$exists' => true)
);

$collection->remove($query);

Per cancellare i documenti abbiamo usato il metodo remove passando la condizione nello stesso modo visto per effettuare le ricerche.

Prima di concludere accenniamo alle modalità di aggiornamento dei documenti. Abbiamo già detto che se preleviamo un documento, ad esempio con il metodo find, e ne modifichiamo i dati, possiamo poi salvare le modifiche effettuate con il metodo save. Grazie al metodo update è invece possibile aggiornare, sia nei contenuti che nella struttura, tutti i documenti che rispondono ad un particolare criterio. Date le sue potenzialità, l’uso di questo metodo è piuttosto complesso e la sua descrizione esula da questo articolo introduttivo.

Effettua l'accesso o registrati per inserire un commento