Les types
Sommaire
- MongoId
- MongoCode
- MongoDate
- MongoRegex
- MongoBinData
- MongoInt32
- MongoInt64
- MongoDBRef
- MongoMinKey
- MongoMaxKey
- MongoTimestamp
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.
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(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?
Version en cache
26/11/2024 06:47:20 Cette version de la page est en cache (à la date du 26/11/2024 06:47:20) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-mongo.types.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.