MongoDB – opérations de base

Pour utiliser MongoDB avec php, MongoDB doit être installé sur le système, et le driver mongo pour php en tant qu’extention. (vous pouvez sauter le paragraphe suivant si le driver est installé )

Installation du driver MongoDB :

Selon le système d’exploitation plusieurs méthodes existent :

Il reste recommandé d’utiliser PECL pour installer le driver mongo. Par ailleurs les drivers sont de plus en plus compris dans les distributions basées sur apache,php,mysql comme par exemple Zend-Server (il suffira de l’activer via l’interface d’administration et de redémarrer apache).

voici comment vérifier que le driver est installé pour php :

php --re mongo

si la commande ne renvoie pas d’exception c’est qu’il est installé.

la commande suivante est une autre manière

<pre>php --ri mongo

si l’extension n’existe pas :

sinon :

mongo

MongoDB Support => enabled
Version => 1.2.6

Directive => Local Value => Master Value
mongo.auto_reconnect => 1 => 1
mongo.allow_persistent => 1 => 1
mongo.default_host => localhost => localhost
mongo.default_port => 27017 => 27017
mongo.chunk_size => 262144 => 262144
mongo.cmd => $ => $
mongo.utf8 => 1 => 1
mongo.native_long => 0 => 0
mongo.long_as_object => 0 => 0
mongo.allow_empty_keys => 0 => 0
mongo.no_id => 0 => 0

voici comment installer le driver via pecl :

(en supposant que vous avez les droits, sinon ajoutez sudo devant ou passez en root)

pecl install mongo

pour mettre à jour le driver :

pecl update-channels
pecl upgrade mongo

Connection à MongoDB via PHP:

pour pouvoir manipuler des données avec MongoDB, on commencera par se connecter au serveur MongoDB, pour ensuite sélectionner une  base de donnée (DB pour la suite), et enfin executer les opérations CRUD dans une collection de cette DB.

voici les quatre classes de base ( la quatrième n’est pas traitée ici ) :

1. Connection au serveur ( classes Mongo et MongoClient ):

$m = new \Mongo();

on récupère ainsi un objet Mongo/MongoClient (selon version du driver). Si on ne donne pas de host la connection se fait sur localhost et le port par défaut est 27017. voici comment spécifier une adresse différente ainsi qu’un port différent

$m = new \Mongo('mongodb://10.1.1.7:34017');

avec l’authentification :

$m = new \Mongo('mongodb://user:password@localhost');

avec la réplication. on indique alors les serveurs ( primaire + les secondaires ) :

$m = new \Mongo(
    'mongodb://rs1.site.local,rs2.site.local',
    ['replicaSet' => 'myReplicaSet']
);

Quelques exemples de code tiré de php.net:

Au cas où le driver est vieux sur un serveur :

$class = 'MongoClient';
if(!class_exists($class))
{
      $class = 'Mongo';
}
$conn = new $class($hosts, $args);

Un exemple avec gestion des exceptions :

try
{
   $m = new MongoClient(); // connection
   $db = $m->selectDB("maBase");
}
catch ( MongoConnectionException $e )
{
   echo '
 ERROR : Impossible de se connecter a MongoDB \
 le server "mongod" n\'est pas joignable
';
   exit();
}

Un exemple de fonction de connection :

function MongoConnect($username, $password, $database, $host)
{
      // Connect to Mongo Server
      $con = new Mongo("mongodb://{$username}:{$password}@{$host}");

      // Connect to Database
      $db = $con->selectDB($database);

     return $db;
}

2. Sélection d’une base de donnée :

Vous remarquerez qu’il y a souvent plusieurs façons de faire la même chose dans MongoDB.

comme on sélectionne une DB,  on récupère un objet MongoDB :

il est possible d’utiliser la méthode suivante comme raccourci

si la DB n’existe pas, il n’y aura pas d’exception de levée pour cette raison et elle sera créée au moment où des données y seront ajoutée ou une collection créée. il est donc important de bien vérifier le nom que l’on utilise.

voici comment récupérer la liste des DB, sur le serveur, un tableau de DB avec leurs taille est ainsi retourné :

$db = $m->listDBs();

un peut aussi effacer une DB :

$m->dropDB('siteDB');  // via les objets MongoClient/Mongo

ou

$db->drop()            // via l'objet MongoDB

3. Sélection/création d’une collection :

sélectionner une collection est similaire, à la selection d’une DB . aussi, si la collection n’existe pas, elle sera créée au moment où des données seront ajoutées. On récupère un objet MongoCollection . Plusieurs manières existent selon qu’on le fait à partire d’un objet Mongo/MongoClient ou MongoDB :

  • à partir d’un objet Mongo/MongoClient :
$collection = $m->siteDB->users;
// ou
$collection = $m->selectCollection('siteDB','users');
  • à partir un objet MongoDB
$collection = $db->selectCollection('users');
// ou
$collection = $db->users;

il peut être utile de récupérer la liste des collections avant d’en sélectionner une :

// récupération d une liste de noms
$listCollectionNames = $db->getCollectionNames();

// récupération d une liste d'instances
$listInstances = $db->listCollections();

aussi on peut avoir besoin de créer ou effacer une collection :

// on crée une capped collection qui sera
// limitée à 500Kb et contiendra 500 documents max
$log = $db->createCollection('logs', true, 512000, 500)

// on crée une collection normale
$stats = $db->createCollection('stats');

// on efface la collection test
$db->dropCollection('test');

Insertion de données :

pour faciliter la lecture, il est aujourd’hui possible d’utiliser la syntaxe PHP suivante :

[ 'clé' => 'valeur' ]

à la place de l’ancienne syntax :

array( 'clé' => 'valeur' )

 

$m = new Mongo();
$c = $m->articles->users;

$c->insert(  ['username' => 'nadia',
              'email' => 'nadia@example.com',
              'roles' => ['admin'],
              'profile' => [ 'account'     => 'active',
                             'lastConnect' => '2012-12-04 20:05:11'
                          ]
              ]  )

$c->insert( ['username' => 'rachid',
              'email' => 'nadia@example.com',
              'roles' => ['moderator','publisher']
              'profile' => [ 'account'     => 'active',
                             'lastConnect' => '2012-12-25 01:09:59'
                          ]
             ] )

Remarquez comment il est aisé de représenter et lire des donnés, que MongoDB stocke en BSON, avec cette syntaxe.

lecture de données :

// Récupération du user nadia
$res1 = $c->findOne(['username' => 'nadia']);

// récupération de tous les admins
$res2 = $c->find(['roles' => 'admin']);

// récupération de tous les user avec un compte actif
$res3 = $c->find(['profile.account' => 'active']);

//
$c->count();                     // retourne le nombre de documents
$c->count(['roles' => 'admin']); // retourne le nombre d'admins

mise à jour de données :

pour la mise à jour, on donne en premier paramètre les patternes de recherche, et en deuxième paramètre, les champs/valeurs à mettre à jour . ici on fait une simple mise à jour du champs status :

// on désactive le user 'rachid'
$c->update(['username' => 'rachid'],
           ['profile.status' => 'disabled']
           );

effacement de données :

// on efface les user avec un username égale à 'rachid'
$c->remove(['username' => 'rachid']);

// efface tous les users
$c->remove();

La méthode remove() est particulièrement violente si on lui donne des critère non précis, il est important de bien cibler les documents à effacer. nous verrons plus tard comment permettre de rendre certains champs des documents uniques grâce aux index.

Did you like this? Share it:

2 Responses to MongoDB – opérations de base

  1. Bobbie Francoise says:

    Heya! I just wanted to ask if you ever have any trouble with hackers? My last blog was hacked and I ended up losing months of hard work due to no back up. Do you have any solutions to protect against hackers?

  2. if your using mongo as a database for your blog, you should block all tcp ports an only let those you need available from outside like http/https, and use authentication in your MongoDB. server. to do so add a user to your MongoDB and restart mongod whith the authentication enabled:

    // to add an administrative user
    use admin
    db.addUser(“Adminuser”,”password”)

    // to add a user for the DB
    use myDB
    db.addUser(“DBuser”,”password”)

    restart your mongod whith –auth (or “auth = true” in the server config )
    N.B. : the administrative user will have access to all the DB.

Open Close