Обновления
Обновления могут быть одной из самых сложных операций, доступных с 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." } ] }
<?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")));
?>