Mongo DB, jour 1

Mongo DB est une base de donnée orientée documents. A la différence des bases de données traditionnelles qui stockent leurs données dans des tables, Mongo DB utilise des collections d'objet (au format JSON). L'avantage de cette disposition, c'est que les colonnes n'ont pas à être fixées à l'avance et que chaque objet dans une collection peut avoir ses propres colonnes. Une base Mongo DB ne nécessite donc pas de schéma.

Autre particularité, des sous-documents peuvent être incorporés dans un document. Si on veut stocker une commande, on peut utiliser une structure de ce type :

{
  num: "C0001",
  customer: "Pierre Martin",
  [
    { article: "Carte graphique", qty: 1, price: 39.90 },
    { article: "Barrette mémoire", qty: 3, price: 13.00 }
  ]
}

On peut donc modéliser de façon beaucoup plus simple certaines relations un-à-N. On dispose aussi des DBRef qui permettent de faire pointer un champ de document vers un autre document. On a donc quelque chose qui ressemble à une clé étrangère, mais on ne peut pas réaliser de jointure.

En fait, Mongo DB pourrait à terme remplacer une combinaison MySQL + Memcache + ORM, ce qui simplifierai grandement le développement et la montée en charge.

Quelques avantages et fonctionnalités intéressantes de Mongo DB :

  • On peut stocker directement des fichiers dans la base. C'est intéressant car on n'est pas limité par la capacité du système de fichier et on peut effectuer des requêtes pour trouver certains fichiers. Par contre, on doit passer par PHP ou un autre logiciel coté serveur pour retrouver le fichier, ce qui affecte les performances. Ce point pourra être résolu avec un module dédié installé dans le serveur Web (on a par exemple un prototype de module Nginx : http://github.com/mdirolf/nginx-gridfs/.
  • Mongo DB est particulièrement adapté pour les logs car on peut limiter la taille des collections (capped collection). Si la taille fixée est atteinte, les informations les plus anciennes sont purgées pour libérer de la place pour les nouveaux enregistrements. Les insertions peuvent être réalisées de manière asynchrone, ce qui évite de ralentir ou de bloquer les scripts.
  • L'API ressemble beaucoup au SQL, ce qui facilite la transition depuis un SGBR.

Et aussi quelques limitations :

  • Pas de support des transactions
  • Limité à 32 bits soit à peu prés 2,5 Go de données

Installation de Mongo DB sur Windows

Il faut télécharger l'archive sur le site officiel et la décompresser dans un répertoire. Ensuite, il faut créer un répertoire c:\data\db qui va servir à stocker les bases de données. Et finalement, on démarre le serveur avec la commande mongod run.

Installation de l'extension PHP

Il faut télécharger l'archive (pour une installation Wamp, choisir PHP 5.3 Thread Safe compilé avec VC6), copier le fichier php_mongo.dll dans le répertoire ext de PHP et activer l'extension dans le php.ini. Après avoir redémarré Apache, Mongo devrait apparaitre dans PHPInfo.

Mongo dans PHPInfo

Un peu de code

<?php
// Connexion au serveur
$connection = new Mongo();

// Sélection d'une base de donnée. Si la base n'existe pas, elle est créée
$db $connection->selectDB('myDb');

// Sélection d'une collection. Si elle n'existe pas, elle est créée
$people $db->selectCollection('people');

// On insère un premier enregistrement
$people->insert(
    array(
        
'firstname' => 'John',
        
'lastname' => 'Doe',
        
'email' => 'john.doe@somewhere.com'
    
)
);

// On insère un second enregistrement. Notez que les colonnes sont différentes.
$people->insert(
    array(
        
'firstname' => 'Jane',
        
'lastname' => 'Doe',
        
'mobile' => '06.01.02.03.04'
    
)
);

header('Content-type: text/plain');

// On retrouve et on affiche tous les éléments de la collection
$docs $people->find();
foreach(
$docs as $doc) {
    
var_dump($doc);
    echo 
"\n";
}

// On retrouve Jane par son prénom
$jane $people->findOne(array('firstname' => 'Jane'));
var_dump($jane);
echo 
"\n";
?>

On peut filtrer les documents avec des expressions régulières, on peut les trier, paginer les résultats...

Installation sous Linux

Là, c'est un peu la galère. Il n'y a pas de paquet officiel pour Gentoo, mais il y en a un disponible dans l'overlay Sunrise. Le gros soucis, c'est qu'il faut une version 4 de GCC. Pour l'instant, je suis en 3.4.5 et il faut donc que je mette à jour mon serveur, ce qui n'est une opération triviale. Mais enfin, j'ai l'impression que Mongo en vaut le coup donc je vais certainement tenter le coup... La suite au prochaine numéro...

A voir également

Portrait de solimap

J'utilise mongoDB depuis

J'utilise mongoDB depuis quelques mois et j'avoue que j'en ai vite oublié MySQL.

Je travaille principalement en Ruby avec mongomapper.

Voici deux projets codés avec Rails et mongoDB : soliMAP et zerty