Обновления

Обновления могут быть одной из самых сложных операций, доступных с MongoDB. Они объединяют запрос с действием, изменяя документы, которые соответствуют критериям. Они также чрезвычайно производительные, что позволяет быстро менять документы и заменять их целиком. Они сделаны на месте (когда это возможно) с небольшими накладными расходами.

Изменение или замена документов

Вы можете использовать два типа обновлений: изменение обновлений и замена обновлений. Изменяющие обновления содержат $-операторы и поля изменений в документе: они могут увеличивать счетчики, помещать новые элементы в массив или изменять тип поля.

Например, изменяющее обновление может добавить новое поле в документ.

<?php
/** предположим, документы выглядят так:
 * {"username" : "...", "password" : "...", "email" : "..."}
 */
$coll->update(array("username" => "joe"), array('$set' => array("twitter" => "@joe4153")));

/** Теперь документ будет выглядеть так:
 * {"username" : "joe", "password" : "...", "email" : "...", "twitter" : "@joe4153"}
 */
?>

Замена обновлений заменяет весь соответствующий документ новым документом. Как правило, они не так эффективны, как использование $-модификаторов, но могут быть очень полезны для сложных операций или обновлений, которые нельзя выразить в терминах $-операторов.

Например, заменяющее обновление может полностью изменить структуру документа.

<?php
/** предположим, документы выглядят так:
 * {"username" : "...", "password" : "...", "email" : "..."}
 */
$coll->update(array("username" => "joe"), array("userId" => 12345"info" => array(
    
"name" => "joe""twitter" => "@joe4153""email" => "..."), "likes" => array()));

/** теперь документ будет выглядеть так:
 * {
 *     "userId" : 12345, 
 *     "info" : {
 *         "name" : "joe", 
 *         "twitter" : "@joe4153", 
 *         "email" : "..."
 *     },
 *     "likes" : []
 * }
 */
?>

Обновление вложенных объектов

Предположим, мы хотим изменить имя автора комментария в этом документе:

{ 
    "_id" : ObjectId("4b06c282edb87a281e09dad9"), 
    "content" : "this is a blog post.",
    "comments" : 
    [
        {
            "author" : "Mike",
            "comment" : "I think that blah blah blah...",
        },
        {
            "author" : "John",
            "comment" : "I disagree."
        }
    ]
}
Чтобы изменить внутреннее поле, мы используем $set (чтобы все остальные поля не были удалены!) с индексом комментария для изменения:
<?php

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

?>

Позиционный оператор

Позиционный оператор $ полезен для обновления объектов, находящихся в массивах. Например, в приведенном выше примере предположим, что мы не знали индекс комментария, который нам нужно было изменить, просто нам нужно было изменить "John" на "Jim". Мы можем использовать для этого $.

<?php

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

?>