With pecl version 1.0.9 of this driver, you can force long support by adding this to your php.ini:
mongo.native_long = 1
see:
http://jira.mongodb.org/browse/PHP-138
and
http://derickrethans.nl/64bit-ints-in-mongodb.html
MongoDB permet aux développeurs de sauvegarder et de rechercher des données exprimées dans tous les types PHP basiques, les types composés (tableaux, tableaux associatifs, et objets), ainsi qu'une demi-douzaine de classes fournies par le driver MongoDB (pour les expressions rationnelles, les dates, et les autres applications spécialisées).
NULL
TRUE
, FALSE
, et NULL
peuvent également être utilisés.
Les nombres sont distincts des chaînes en MongoDB : "123" ne correspond pas à 123. Aussi, si vous voulez vous assurer que les nombres soient correctement triés et correspondent parfaitement, vous devez vous assurer qu'ils sont bien sauvegardés comme des nombres.
<?php
$doc = array("a" => 123, "b" => "123");
$collection->insert($doc);
$doc->find(array("a" => 123)); // correspond
$doc->find(array("a" => "123")); // Ne correspond pas
$doc->find(array("a" => 123.0)); // correspond
$doc->find(array("b" => 123)); // Ne correspond pas
$doc->find(array("b" => "123")); // correspond
?>
Comme vous pouvez le constater ci-dessus, les nombres à virgule flottante peuvent être comparés et correspondre à des nombres entiers.
Par défaut, sur un système 32-bits, les nombres sont envoyés à la base de données sous la forme d'entiers 32-bits. Sur les système 64-bits, ils sont envoyés sous la forme d'entiers 64-bits. En raison de compatibilité ascendante, tous les systèmes linéarisent les entiers 64-bits sous la forme de nombres à virgule flottante. Les nombres à virgule flottante ne sont pas exacts. Si vous avez besoin de nombres exacts, vous devez personnaliser votre fichier de configuration php.ini.
Sur les systèmes 32-bits, si l'option mongo.long_as_object
est définie, les entiers 64-bits seront retournés sous la forme d'objets
MongoInt64. Les entiers seront stockés dans le champ
value
avec une précision parfaite (comme les chaînes).
Vous pouvez également utiliser la méthode MongoInt64
pour sauvegarder des entiers 64-bits sur des machines 32-bits.
Sur les systèmes 64-bits, vous pouvez définir soit l'option
mongo.long_as_object
, soit l'option
mongo.native_long
. mongo.native_long
retournera des entiers 64-bits et des entiers PHP "normaux". Vous pouvez
utiliser la méthode MongoInt32 pour sauvegarder
des entiers 32-bits sur des machines 64-bits.
Vous devriez définir les options mongo.long_as_object
et
mongo.native_long
si vous comptez les utiliser,
même si c'est le comportement par défaut (et ce, afin de vous protéger
contre de futures modifications sur les valeurs par défaut).
Voir aussi : php.ini Options, MongoInt32, MongoInt64.
Les chaînes doivent être en UTF-8. Les chaînes qui ne le sont pas doivent soit être converties en UTF-8 avant l'envoi à la base de données, soit sauvegardées comme données binaires.
Les expressions rationnelles peuvent être utilisées pour chercher une chaîne, et elles sont exprimées en utilisant la classe MongoRegex.
Les chaînes non-UTF-8, les images ainsi que toutes autres données binaires doivent être envoyées à la base de données en utilisant le type MongoBinData.
Les dates peuvent être créées en utilisant la classe MongoDate. Elles sont stockées sous la forme du nombre de milliseconde depuis l'époque Unix.
MongoTimestamp n'a pas pour but de sauvegarder des dates ou des timestamps, elle est utilisée en interne par MongoDB. Sauf si vous créez un outil qui interagit avec la réplication ou le partage interne, vous devriez utiliser MongoDate, et non MongoTimestamp.
Le driver créera automatiquement un champ _id
avant
d'insérer un document (sauf si un tel champ est spécifié par l'utilisateur).
Ce champ est une instance de MongoId (appelée "ObjectId"
dans la plupart des autres langages).
Ces identifiants sont sur 12 octets et composés de :
4 octets pour le timestamp
Deux enregistrements ne peuvent pas avoir le même identifiant s'ils sont insérés à des moments différents.
3 octets pour l'identifiant de la machine
Deux enregistrements ne peuvent pas avoir le même identifiant s'ils ont été insérés sur des machines différentes.
2 octets pour l'identifiant du thread
Deux enregistrement ne peuvent pas avoir le même identifiant s'ils ont été enregistrés par des threads différents s'exécutant sur la même machine.
3 octets pour une valeur incrémentée
Chaque fois qu'un identifiant est créé, un compteur global est incrémenté et utilisé comme valeur d'incrémentation pour le prochain identifiant.
MongoDB est fourni avec un moteur Javascript, ainsi, vous pouvez embarquer du Javascript dans une requête (en utilisant une clause $where), et l'envoyer directement à la base de données pour exécution, et l'utiliser pour effectuer des agrégations.
Pour des raisons de sécurité, utilisez le champ scope
de MongoCode pour utiliser les variables PHP dans
Javascript. Le code qui ne requière pas de valeurs externes peut soit
utiliser MongoCode, soit être juste une chaîne.
Voir la section sur la sécurité
pour plus d'informations sur l'envoi de javascript à la base de données.
Les tableaux et les objets peuvent également être sauvegardés dans la base de données. Un tableau avec des clés numériques ascendantes sera sauvegardé sous la forme d'un tableau, tout le reste sera sauvegardé sous la forme d'un objet.
<?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 votre requête pour ces objets utilise le shell de la base de données, elle ressemblera à :
> 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 aussi sauvegarder des objets PHP arbitraires (même si ils seront retournés sous la forme de tableaux associatifs). Les champs sont utilisés pour les paires clés/valeurs. Par exemple, un article de blog peut ressembler à ceci :
<?php
// la classe d'articles de 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 simple article de blog et on l'insère dans la base de données
$post1 = new Post("Adam", "This is a blog post");
$blog->insert($post1);
// Il n'y a rien qui restreint le type du champ "author", il peut donc être 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 en définissant le titre
$post2->setTitle("Second Post");
$blog->insert($post2);
?>
Depuis le shell de la base de données, cela va ressembler à :
> 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 donnera une erreur fatale :
<?php
$collection->insert($GLOBALS);
?>
Fatal error: Nesting level too deep - recursive dependency?
With pecl version 1.0.9 of this driver, you can force long support by adding this to your php.ini:
mongo.native_long = 1
see:
http://jira.mongodb.org/browse/PHP-138
and
http://derickrethans.nl/64bit-ints-in-mongodb.html