Les types

Sommaire

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).

Booléens et NULL

TRUE, FALSE, et NULL peuvent également être utilisés.

Les nombres

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.

Les grands nombres

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

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 données binaires

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.

Dates

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.

Identifiants uniques

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.

Ainsi, deux enregistrements ne peuvent avoir le même identifiant tant qu'un seul processus, sur une seule machine, n'arrivera à insérer 256^3 (plus de 16 millions) de documents en une seconde, pouvant ainsi écraser le champ d'incrémentation.

JavaScript

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.

Tableaux et objets

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(981007385);
$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?
Si vous avez besoin d'insérer des documents qui peuvent avoir des dépendances récursives, vous devez les vérifier vous-même avant de les passez dans le driver.

add a note add a note

User Contributed Notes 1 note

up
-1
Jay Paroline
14 years ago
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
To Top