Как стать автором
Обновить

MongoDB: Создание, обновление и удаление документов

Время на прочтение3 мин
Количество просмотров77K
В рамках чтения мной книги “MongoDB: The Definitive Guide” Kristina Chodorow and Michael Dirolf, решил выписывать основные моменты из глав, для лучшего освоения материала. Возможно, кому-то это тоже будет полезно.

Insert



Insert — базовый метод для добавление информации в MongoDB. Для того, чтоб добавить документ в коллекцию делаем вот так:

> db.foo.insert( { “bar” : “baz” } );

В таких ситуациях, когда нужно добавить несколько документов, для более быстрой вставки желательно использовать, так называемые, batch insert’ы (групповая вставка)

> db.foo.insert( { “arr” : [ { a : 1 , b : 1 } , { a : 2 , b : 2 } ] } );

Грубо говоря, просто вставляем массив.

Remove



Всю информацию из коллекции можно удалить вот так:

> db.users.remove();

Это не удаляет саму коллекцию или любые индексы из неё.
Удалить объект по какому то параметру можно вот так:

> db.users.remove( { “name” : “Vasya” } );

Удаление достаточно быстрая операция, но если вы хотите очистить коллекцию, зачастую, будет быстрее удалить саму коллекцию (drop) и пересоздать индексы.

> db.drop_collection( “bar” );

Update



Простейший тип update’а это полная замена совпавших документов. Был вот такой документ:

}
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "joe",
"age" : 18
}


Если мы сделаем вот так, то заменится весь документ:

> db.users.update( { “name” : ”joe” } , { “name” : “vasya” } );

т.е. будет

}
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "vasya"
}


После этого запроса обновится только первый найденный документ, о мультиапдейте чуть ниже.

Модификаторы


Если мы хотим выполнить инкремент какого то поля, то используем модификатор $inc. Чтоб увеличить возраст на 2 года делаем так:

> db.users.update( { name: “joe” } , { $inc : { age: 2 } } );

Если нужно установить значение какого то ключа используем модификатор $set

> db.users.update( { name:”joe” } , { $set: { age: 25 } } );

Он находит документ, где имя joe и устанавливает age в 25. Важно, что если ключа age нет, то он будет создан.

Если нужно удалить ключ существует модификатор $unset

> db.users.update( { name: ”joe” } , { $unset: { age : 1 } } );

Модификаторы массивов


Добавить элемент в массив можно с помощью $push. Допустим у этого же joe ещё хранится список его друзей, как-то так:
}
"_id" : ObjectId("4b2b9f67a1f631733d917a7a"),
"name" : "joe",
"age" : 18,
“friends”: [
{name: “john”},
{name: “helen”}
]
}


Хотим добавить к друзьям ещё peter’a

> db.users.update( { name: “joe” } , { $push: { friends: { name: “peter” } } } );

Такая штука добавит peter’a в конец массива друзей joe.
Если есть $push, значит должен быть и $pop:

> db.users.update( { name: ”joe” } , { $pop: { friends: 1 } } );

Это удалит элемент массива из конца, а вот это из начала

> db.users.update( { name: ”joe” }, { $pop: { friends: -1 } } );

Также есть полезная вещь $addToSet — работает по аналогии с $push, но с проверкой на уникальность.

Иногда нужно удалить элемент массива по какому то критерию, тогда используется модификатор $pull:

> db.users.update( { }, { $pull: { friends: { name: “john” } } } );

Это удалит из друзей john’a

Позиционные модификаторы массивов


Существует 2 способа манипуляции со значениями в массиве: по конкретной позиции или с помощью использования позиционного оператора (символ $).

Например, в списке друзей joe хранятся не только их имена друзей, но и их возраст, и мы хотим увеличить возраст друга под индексом 0 на 3 года:

> db.users.update( { name: “joe” } , { $inc: { “friends.0.age” : 3 } } );

Если же мы хотим увеличить возраст конкретного друга, например, john’a, но мы не знаем под каким индексом он лежит в массиве, мы делаем вот так:

> db.users.update( { “friends.name”: “john” } , { $inc: { “friends.$.age” : 3 } } );

Upserts


Upsert — это особый тип update’a. При его использовании, если документ по запрашиваему критерию не найден, то он будет создан, если же найден, то он будет обновлён, как обычно. Чтоб использовать upsert нужно просто в команде update добавить третий параметр равный true, вот так:

> db.users.update( { name: “helen” } , { $set: { age: 23 } } , true );

Если в нашей коллекции нет документа c именем “helen”, то он будет создан вместе с полем age: 23.

Multiple Update


Все предыдущие примеры с использованием команды update находили первый документ и обновляли его. Для того, чтоб выполнить множественное обновление нужно добавить в update четвертый параметр со значением true:

> db.users.update( { age: 18 } , { $inc: { age: 1 } } , false, true );

Этот запрос найдёт всех, у кого возраст 18 лет и увеличит его на 1.

Вообщем на этом всё. Это не все модификаторы, только основные.
Будет время, будет продолжение.
Теги:
Хабы:
Всего голосов 57: ↑38 и ↓19+19
Комментарии22

Публикации

Истории

Ближайшие события