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

В рамках чтения мной книги “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.

Вообщем на этом всё. Это не все модификаторы, только основные.
Будет время, будет продолжение.

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 22

    +1
    Для любопытствующих MongoDB рекомендую онлайн консоль: www.mongodb.org/ — нажать TRY IT OUT
      +1
      Тоже для любопытствующих Презентация функционала mongodb с конференции
        +2
        www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart Тут как-то лучше описано
          0
          по сути топик и не претендует на статус офф документации :)
          0
          «The Little MongoDB Book» by Karl Seguin — очень неплохо написанная книга для начинающих (англ, но читается очень легко).
          А в тему перехода SQL-to-MongoDB — вот интересный cheat sheet.
            +10
            Зачем вы пересказали документацию с сайта? :)
              +1
              раз люди добавляют это в избранное, значит кому-то оно нужно ;)
                0
                спасибо за пересказ док. в букмарки добавил только из-за комментов
              +3
              Лучше б рассказали о своем опыте работы с монго, вместо сухого перевода доков.
              А по сути вопроса — вот отличный, интерактивный туториал — tutorial.mongly.com/tutorial/index
                0
                Я ж говорю — читаю книжку, делаю выборку основных моментов прежде всего для себя. Кому это интересно, те добавили это в избранное (на данный момент 57 человек, что как для первого топика на хабре, как мне кажется, довольно неплохо). Я считаю топик нашёл свою аудиторию.

                P.S. интересный туториал, возьму на заметку
                0
                кстати коллеги недавно побеседовал с Kristina Chodorow очень милая дама
                можете послушать здесь
                programmer.rpod.ru/256877.html
                Дискламер — я не подкастер и не претендую — просто иногда записываю беседы с интересными людьми
                  0
                  /*любопытствующий*/ есть какие-нибудь хорошие GUI для MongoDB?
                  0
                  немного напугао отсутствие ROW блокировок. то есть возможно при сильной конкуренции будут высокие задержки. ну и конечно типизация полей идиотская абсолютно.

                  хочу типы данных: decimal, text, bool и в принципе все… а то элементарно 32 и '32' разные вещи…
                    0
                    Строка из десяти цифр занимает больше места, чем число с десятью порядками в бинарном виде. Подумайте об оптимизации. Если вам нужны только числа, зачем платить больше за призрачную возможность впихнуть куда-то букву?
                      0
                      Дмитрий, возможно вас спутал тип decimal, который я неуместно употребил. Разговор конечно шел (думая параллельно об оптимизации) о Numerical (числовой — что-то вроде bigint или long long из C/C++).

                      Так что жду ваш комментарий насчет: numerical(bigint), text и bool.

                      — При реальном использовании MongoDB столкнулся с тем, что '32' и 32 не одно и тоже и самое страшное, что поиск по индексу 32 и '32' тоже не одно и тоже. По этому одна нелепая ошибка в приведении типов или выход за MAX_INT и у Вас уже STRING ;)

                      Так что все-таки лучше легковесную базу завести с какой-то типизацией полей. В конце концов можно и MyISAM использовать как Key-Value.
                        0
                        А что меня пугает еще больше так это то что MongoDB абсолютно не пугает индекс построенный по text, numerical и даже по bool.

                        Тут уже конечно совсем сложно понять как это чудо там работает и ищет…

                        Вообщем MongoDB пока вижу как удобную базу для хранения промежуточных результатов работы парсеров, логеров и т.п. однопоточных скриптов ;)

                        P.S. Если не прав поправьте…

                  Only users with full accounts can post comments. Log in, please.