Actualizaciones

Las actualizaciones quizás sean las operaciones más complicadas de las disponibles en MongoDB. Combinan una consulta junto con una acción, modificando los documentos que concuerdan con los criterios de selección. Son también muy potentes, permitiendo cambiar rápidamente los documentos y reemplazarlos. Se realiza al momento (siempre y cuando sea posible), minimizando el consumo de recursos.

Modificación o reemplazo de documentos

Existen dos tipos de actualizaciones: actualizaciones de modificación y actualizaciones de reemplazado. Las actualizaciones de modificación contienen operandos $ y cambian los campos de un documento: pueden incrementar contadores, agregar elementos a un array, o modificar el tipo de dato de un campo.

Por ejemplo, una actualización de modificación puede añadir un nuevo campo a un documento.

<?php
/** supongamos un documento así:
 * {"username" : "...", "password" : "...", "email" : "..."}
 */
$coll->update(array("username" => "joe"), array('$set' => array("twitter" => "@joe4153")));

/** ahora el documento sería así:
 * {"username" : "joe", "password" : "...", "email" : "...", "twitter" : "@joe4153"}
 */
?>

Las actualizaciones de reemplazado modifican todo el documento seleccionado por otro nuevo. Generalmente no es tan eficientes como usar operandos $, pero pueden ser muy útiles en operaciones complejas o en actualizaciones que no se pueden expresar en términos de operandos $.

Por ejemplo, una actualización de reemplazado puede cambiar por completo la estructura de un documento.

<?php
/** supongamos un documento así:
 * {"username" : "...", "password" : "...", "email" : "..."}
 */
$coll->update(array("username" => "joe"), array("userId" => 12345"info" => array(
    
"name" => "joe""twitter" => "@joe4153""email" => "..."), "likes" => array()));

/** ahora el documento quedaría así:
 * {
 *     "userId" : 12345, 
 *     "info" : {
 *         "name" : "joe", 
 *         "twitter" : "@joe4153", 
 *         "email" : "..."
 *     },
 *     "likes" : []
 * }
 */
?>

Actualizando Objetos Anidados

Supongamos 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."
        }
    ]
}
Para cambiar el campo interno, usamos $set (de manera que no se eliminen el resto de campos) con el índice del comentario a cambiar:
<?php

$blog
->update($criteria, array('$set' => array("comments.1" => array("author" => "Jim"))));

?>

El Operador Posicional

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")));

?>