MongoDB permet aux développeurs de sauvegarder et de requérir des données en utilisant tous les types basiques de PHP, comme les tableaux, les tableaux associatifs, les objets mais aussi en utilisant toutes les classes fournies par le driver PHP MongoDB (pour les expressions rationnelles, les dates et les autres applications spécialisées).
Les types internes sont :
Type | Description | Taille dans MongoDB (en octets) |
---|---|---|
NULL | La classique valeur NULL | 0 |
boolean | TRUE et FALSE | 1 |
int | Valeurs entières | 4 |
float | Valeurs doubles | 8 |
string | chaîne de caractères en UTF-8 | longueur de la chaîne + 1 |
Les tableaux et les objets peuvent également être sauvegardés dans la base de données. Un tableau possédant des clés numériques sera sauvegardé sous la forme d'un tableau, tous les autres seront sauvegardés sous la forme d'objets.
<?php
// $scores sera sauvegardé sous la forme d'un tableau
$scores = array(98, 100, 73, 85);
$collection->insert(array("scores" => $scores);
// $scores sera sauvegardé sous la forme d'un objet
$scores = array("quiz1" => 98, "midterm" => 100, "quiz2" => 73, "final" => 85);
$collection->insert(array("scores" => $scores);
?>
Si vous interrogeais ces objets en utilisant la console de base de données, elles ressembleront à ceci :
> db.students.find() { "_id" : ObjectId("4b06beada9ad6390dab17c43"), "scores" : [ 98, 100, 73, 85 ] } { "_id" : ObjectId("4b06bebea9ad6390dab17c44"), "scores" : { "quiz1" : 98, "midterm" : 100, "quiz2" : 73, "final" : 85 } }
La base de données peut également être sauvegardé sous forme d'objets PHP (malgré le fait qu'elle soit en réalité retourné sous la forme d'un tableau associatif). Ces champs sont utilisés pour les paires clé/valeurs. Par exemple, un billet de blog peut ressembler à ceci :
<?php
// La classe permettant de gérer le billet d'un blog
class Post {
var $author;
var $content;
var $comments = array();
var $date;
public function __construct($author, $content) {
$this->author = $author;
$this->content = $content;
$this->date = new MongoDate();
}
public function setTitle($title) {
$this->title = $title;
}
}
// Crée un billet simple et l'insère dans la base de données
$post1 = new Post("Adam", "This is a blog post");
$blog->insert($post1);
// Rien ne restreint le type du champ "author", nous pouvons donc en faire
// un objet imbriqué
$author = array("name" => "Fred", "karma" => 42);
$post2 = new Post($author, "This is another blog post.");
// Nous créons un champ supplémentaire pour y définir le titre
$post2->setTitle("Second Post");
$blog->insert($post2);
?>
Depuis la console de la base de données, les données ressembleront à ceci :
> db.blog.find() { "_id" : ObjectId("4b06c263edb87a281e09dad8"), "author" : "Adam", "content" : "This is a blog post", "comments" : [ ], "date" : "Fri Nov 20 2009 11:22:59 GMT-0500 (EST)" } { "_id" : ObjectId("4b06c282edb87a281e09dad9"), "author" : { "name" : "Fred", "karma" : 42 }, "content" : "This is a blog post", "comments" : [ ], "date" : "Fri Nov 20 2009 11:23:30 GMT-0500 (EST)", "title" : "Second Post" }
Le driver ne détectera pas les boucles de référence dans les tableaux et les objets. Par exemple, ceci produira une erreur fatale :
<?php
$collection->insert($GLOBALS);
?>
Fatal error: Nesting level too deep - recursive dependency?
Le driver MongoDB définit également quelques nouveaux types à utiliser avec la base de données. Reportez-vous à la documentation de la classe correspondante pour plus de détails ainsi que des exemples.
Type | Description | Taille dans MongoDB (en octets) |
---|---|---|
MongoBinData | Donnée binaire | Nombre d'octets des données binaires + 5 |
MongoCode | Code Javascript | Longueur du code Javascript + taille de l'objet de contexte |
MongoDate | Dates et heures. Stocké sous forme de timestamp | 8 |
MongoId | Identifiant unique du document :
|
12 |
MongoMinKey | Toujours plus petite que n'importe quelle autre valeur | Longueur du code + taille de l'objet de contexte |
MongoMaxKey | Code JavaScript | Toujours plus grande que n'importe quelle autre valeur |
MongoRegex | Expressions rationnelles | Nombre de caractères de l'expression rationnelle + nombre de drapeaux utilisés |
MongoTimestamp | Timestamp partagé | 8 |
Voici la liste des types supportés par Mongo, mais pas par le driver PHP :
Type | Description | Taille dans MongoDB (en octets) |
---|---|---|
long | Vu que PHP ne supporte pas les entiers sur 8 octets, ces valeurs récupérées depuis la base de données sont automatiquement converties en valeur double. Les entiers seront toujours sauvegardés dans la base de données sur 4 octets (y compris sur les machines supportant le stockage sur 8 octets) et les valeurs doubles seront sauvegardées sur 8 octets, ainsi, il n'y a aucun moyen de sauvegarder une valeur de type longue dans la base de données en utilisant le driver PHP. | 8 |
MongoDB utilise un format de stoquage appelé "BSON" (Binary Serializable Object Notation) qui est similaire à JSON mais en plus compact et est plus riche en types. Ci-dessous, nous avons listés la taille exacte en octets de chaque type (ou les informations nécessaires pour calculer leurs tailles, dans le cas de types variables en longueur). Gardez à l'esprit que ces tailles n'incluent pas les noms des champs. La taille d'un objet peut être calculée manuellement, mais c'est plus facile pour un développeur d'appeler la fonction bson_encode() et de prendre la longueur de la chaîne résultante.
Exemple de calcul manuel d'un taille BSON pour sauvegarder l'objet array("x" => null, "y" => 40) :
4 bytes (object size) 1 byte (type of "x" field) 2 bytes ("x" and "\0") 0 bytes (for null) 1 byte (type of "y" field) 2 bytes ("y" and "\0") 4 bytes (for an integer) 1 byte (end-of-object byte) ----------------------- 15 bytes