Par défaut, le driver n'attend pas la réponse de la base de données pour écrire (insertion, mise à jour et suppression). Cela signifie que les écritures peuvent être exécutées très rapidement, mais vous ne savez pas si elles ont réussi ou pas. Les écritures peuvent échouer pour plusieurs raisons : s'il y a un problème réseau, si un serveur de base de données n'est plus accessible, ou si l'écriture est tout simplement invalide (e.g., l'écriture sur une collection système).
Pour récupérer une réponse de la base de données, vous devez utiliser l'option safe disponible pour tous les types d'écriture. Cette option s'assure que la base de données a bien pris en compte l'écriture avant d'en retourner le succès de l'opération. Si l'écriture échoue, elle lancera une exception MongoCursorException() contenant la raison de l'échec.
Lors du développement, vous devriez toujours utiliser des écritures sécurisées (afin de vous protéger des erreurs courantes, comme la duplication de clés, et autres). En production, les écritures non sécurisées doivent être utilisées pour les données qui ne sont pas importantes. Ce genre de données dépend de l'application, mais c'est généralement des données automatiques (à contrario des données générées par les utilisateurs), comme un suivi des clics ou des localisations GPS, pour lesquelles des centaines d'enregistrements sont insérés à la seconde.
Pour effectuer des écritures sécurisées sans trop vous pénalisez en terme de performance, il est recommandé de faire des écritures sécurisées à la fin d'une série d'écritures. Par exemple :
<?php
$collection->insert($someDoc);
$collection->update($criteria, $newObj);
$collection->insert($somethingElse);
$collection->remove($something, array("safe" => true));
?>
Ensuite, si la dernière écriture lance une exception, vous savez qu'il y a un problème avec votre base de données.
Il y a quelques autres options disponibles pour s'assurer de la sécurité des écritures. Vous pouvez spécifier "fsync" => true pour forcer la base de données à se synchroniser sur le disque (par défaut, MongoDB s'y synchronise une fois par minute).
La façon la plus sécurisée de réaliser des écriture est d'utiliser la réplication et de spécifier le nombre de serveurs qui doivent recevoir cette écriture avant que le processus ne retourne le succès de l'opération. (Vous devriez toujours utiliser la réplication en production ; reportez-vous à la section sur la connexion pour plus de détails sur le jeu de réplication)
<?php
$collection->insert($someDoc, array("safe" => 3));
?>
Si vous spécifiez "safe" => N, le serveur MongoDB s'assurera qu'au moins N serveurs ont une copie de l'écriture avant de retourner le succès de l'opération. Ainsi, si N vaut 3, le serveur principal et 2 esclaves doivent avoir reçus l'écriture avec succès.
Supposez que vous souhaitez modifier le nom de l'auteur de ce commentaire, dans ce document :
{ "_id" : ObjectId("4b06c282edb87a281e09dad9"), "content" : "this is a blog post.", "comments" : [ { "author" : "Mike", "comment" : "I think that blah blah blah...", }, { "author" : "John", "comment" : "I disagree." } ] }
<?php
$blog->update($criteria, array('$set' => array("comments.1" => array("author" => "Jim"))));
?>
L'opérateur de position $ est utile pour mettre à jour les objets qui sont des tableaux. Dans l'exemple ci-dessus, supposons que nous ne connaissons pas l'index du commentaire que nous souhaitons modifier, mais juste que nous souhaitons modifier "John" en "Jim". Nous pouvons ici utiliser $ pour arriver à nos fins.
<?php
$blog->update(
array("comments.author" => "John"),
array('$set' => array('comments.$.author' => "Jim")));
?>