Por omisión, el driver no espera a que la base de datos responda para realizar las escrituras (inserciones, actualizaciones, y eliminacioens). Esto significa que las escrituras pueden llevars a cabo extremadamente rápido, pero no puede saberse si realmente han tenido o no éxito. Existen varias razones para que una escritura falle: si hay problemas de red, si el servidor de bases de datos se cae, o simplemente que la escritura era inválida (p.ej., escribir en una colección del sistema).
Para obtener una respuesta de la base de datos, utilice la opción safe, disponible en todos los tipos de escritura. Esta opción se asegura de que la base de datos realiza la escritura antes de notificar del éxito. Si la escritura falla, emitirá una excepción MongoCursorException(), explicando la razón del fallo.
Durante la etapa de desarrollo, deben usarse siempre escrituras seguras (para prevenir errores involuntarios, como errores de claves duplicadas y similares). En el entorno de producción, pueden usarse escrituras no seguras sobre datos "no importantes". Los datos no importantes dependen de la aplicación, pero se suele tratar de datos automáticos (en lugar de datos generados por el usuario), como un contador de clics o las coordenadas GPS, donde se puede obtener miles de registros por segundo.
Para llevar a cabo escrituras seguras sin que ello suponga un impacto en el rendimiento, se recomienda realizar la escritura segura al finalizar una serie de escrituras. Por ejemplo:
<?php
$collection->insert($someDoc);
$collection->update($criteria, $newObj);
$collection->insert($somethingElse);
$collection->remove($something, array("safe" => true));
?>
De este modo, si la última escritura lanza una excepción, sabrá que hay un problema con la base de datos.
Hay más opciones disponible para asegurar la seguridad de las escrituras. Puede especificarse "fsync" => true para forzar a la base de datos a fsync (sincronizar) todas las escrituras en disco realizadas hasta ahora (por omisión, MongoDB sincroniza en disco las escrituras una vez por minuto).
La forma más segura de realizar una escritura consiste en usar réplicas y en especificar el número de servidores en que se harán las escrituras antes de obtener el éxito. (En producción siempre deben usarse réplicas, revise la sección de Conexión para más información sobre conjuntos de réplicas.)
<?php
$collection->insert($someDoc, array("safe" => 3));
?>
Si indica "safe" => N, el servidor MongoDB se asegurará de que al menos N servidores tienen una copia de la escritura antes de notificar el éxito. De modo que, si N es 3, el maestro y al menos 2 esclavos deben haber realizado las escrituras.
Supogamos que queremos cambiar el nombre del autor de un comentario en este documento:
{ "_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"))));
?>
El operador posicional $ es útil a la hora de actualizar objetos en arrays. En el ejemplo anterior, por ejemplo, podríamos no conocer el índice del comentario que necesitamos modificar, sólo sabemos que queremos cambiar "John" a "Jim". Podemos usar $ para lograrlo.
<?php
$blog->update(
array("comments.author" => "John"),
array('$set' => array('comments.$.author' => "Jim")));
?>