Используя объектно-ориентированный подход в разработке ПО, мы разделяем проектируемую систему на логические составляющие для того, чтобы составить умозрительную концепцию в своей голове. Получая эту концепцию нам становится проще определить границы логических операций над данными, а также структуру и состояния самих данных в тот или иной момент времени.
Представьте себе, что у вас есть возможность программно оперировать логическими моделями почти в неизменном виде вместо того, чтобы превращать их в набор таблиц, поле и строк реляционной базы данных? Разобравшись с MongoDB вы получите такую возможность!
В серии статей посвящённых MongoDB, мы с вами разберёмся с азами работы, такими как создание, изменение и удаление баз данных и записей, а также более сложными вещами — сложными выборками данных и анализом при помощи MapReduce. Поехали!
Установка MongoDB
Загрузить MongoDB для своей платформы вы можете в соответствующем разделе их сайта или же порыться в репозиториях своего дистрибутива. У меня в системе на данный момент используется Arch Linux, где всё необходимое было установлено одной командой:
1 |
sudo pacman -S mongodb |
После успешной установки необходимо запустить сервер MongoDB:
1 |
sudo pacman rc.d start mongodb |
Всё. Теперь можно приступать к нашему увлекательному туру по просторам MongoDB!
И последнее замечание. В этой серии статей все примеры тестируются на стабильной версии MongoDB 2.2.1 и если у вас установлена unstable-версия или более новая, то помните об этом, чтоб не оказаться самому себе злым Буратино.
Запустите в терминале
1 |
mongo |
И если сервер был установлен и запущен корректно, вы увидите приглашение оболочки MongoDB:
Создание базы данных и вставка записей
После того, как сервер установлен, базы данных не существует. Но не волнуйтесь, она будет тут же создана, как только мы начнём вставлять записи, чем мы сейчас и займёмся. Скопируйте в буфер обмена нижеприведённый код и выполните его в оболочке MongoDB:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
db.nettuts.insert({ first: 'matthew', last: 'setter', dob: '21/04/1978', gender: 'm', hair_colour: 'brown', occupation: 'developer', nationality: 'australian' }); db.nettuts.insert({ first: 'james', last: 'caan', dob: '26/03/1940', gender: 'm', hair_colour: 'brown', occupation: 'actor', nationality: 'american' }); db.nettuts.insert({ first: 'arnold', last: 'schwarzenegger', dob: '03/06/1925', gender: 'm', hair_colour: 'brown', occupation: 'actor', nationality: 'american' }); db.nettuts.insert({ first: 'tony', last: 'curtis', dob: '21/04/1978', gender: 'm', hair_colour: 'brown', occupation: 'developer', nationality: 'american' }); db.nettuts.insert({ first: 'jamie lee', last: 'curtis', dob: '22/11/1958', gender: 'f', hair_colour: 'brown', occupation: 'actor', nationality: 'american' }); db.nettuts.insert({ first: 'michael', last: 'caine', dob: '14/03/1933', gender: 'm', hair_colour: 'brown', occupation: 'actor', nationality: 'english' }); db.nettuts.insert({ first: 'judi', last: 'dench', dob: '09/12/1934', gender: 'f', hair_colour: 'white', occupation: 'actress', nationality: 'english' }); |
Получилось? Прекрасно! Чтобы убедиться в том, что база данных и записи были созданы, выполните следующую команду:
1 |
db.nettuts.find() |
Если всё прошло так, как нужно, вы увидите следующий вывод:
Это и есть созданные записи. Обратите внимание на появившееся поле _id, которое мы не заказывали при добавлении записей. Оно добавляется MongoDB автоматически, если вы его не указываете, поскольку каждая запись в БД должна иметь уникальный ключ.
Итак, записи созданы, теперь у нас всё готово для того, чтобы поупражняться в поиске.
Выборка записей
Помните предыдущую команду? Она выбирает и отображает из БД содержимое всех записей. А как насчёт детальной выборки данных? Как нам выбрать только лиц женского пола, отфильтровав мужчин? Хороший вопрос. Ответом на этот вопрос являются селекторы.
Селекторы
Селекторы в MongoDB это то, что в традиционном SQL называется WHERE-условиями. Так же, как и при использовании WHERE в SQL, селекторы в Mongo позволяют делать следующее:
- определять критерии, которым должны соответствовать искомые записи (аналог оператора AND в SQL);
- определять критерии, которым могут соответствовать искомые записи (аналог оператора OR в SQL);
- и многое другое
Записи, которые ДОЛЖНЫ соответствовать критериям
Начнём с простого. Скажем, нам необходимо выбрать всех женщин. Следующая команда делает это:
1 |
db.nettuts.find({gender: 'f'}); |
Эта команда выбирает записи, у которых поле 'gender' имеет значение 'f'. После её выполнения вы должны увидеть такой вывод:
Окей, а что если нам нужны только мужчины? Просто определяем другое значение поля 'gender' в селекторе:
1 |
db.nettuts.find({gender: 'm'}); |
Выборка по нескольким критериям
Двигаемся дальше. теперь нам нужны мужчины англичане:
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}]}); |
А как насчёт мужчин англичан или американцев? Легко! Слегка дополним предыдущую команду:
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}, {nationality: 'american'}]}); |
Сортировка
Что, если нам необходимо сортировать записи, скажем по имени или национальности? Аналогом SQL-инструкции ORDER BY в MongoDB является метод sort (), принимающий в качестве параметров список полей и направление сортировки. В отличие от SQL направление сортировки в MongoDB указывается числами 1 — для сортировки по возрастанию и -1 — для сортировки по убыванию.
Давайте посмотрим как это работает на примере выборки всех английских или американских мужчин, сортируя записи по национальности в порядке убывания:
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}, {nationality: 'american'}]}).sort({nationality: -1}); |
А как насчёт сортировки национальности по убыванию, а имени по возрастанию? Никаких проблем, немного дополним запрос:
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}, {nationality: 'american'}]}).sort({nationality: -1, first: 1}); |
Как видим, в этот раз Arnold Schwarzenegger выводится перед Tony Curtis.
Ограничение выборки
Что, если у нас в результате выборки получается довольно большой объём данных и нам необходимо ограничить его, скажем, двумя записями. Mongo предоставляет метод limit (), аналогичный одноименной инструкции в MySQL. Давайте перепишем предыдуший запрос таким образом, чтобы он возвращал только первые две записи:
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}, {nationality: 'american'}]}).limit(2); |
А что, если нам нужны не первые две записи, а только третья и четвёртая. Для того, чтобы пропустить нужное количество записей результата выборки в MongoDB есть отдельный метод skip ():
1 |
db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}, {nationality: 'american'}]}).limit(2).skip(2); |
Как видим, две первые записи были пропущены.
Изменение записей
Как вы и ожидали, MongoDB умеет кроме всего прочего изменять существующие записи. Так же, как и в SQL, и в методе find () MongoDB, вам необходимо определить критерии выборки изменяемых записей, а затем поля записей, значения которых необходимо изменить.
Предположим, нам необходимо изменить цвет волос у James Caan с седого на каштановый. Пример ниже показывает, как это сделать, используя метод update ():
1 |
db.nettuts.update({first: 'james', last: 'caan'}, {$set: {hair_colour: 'brown'}}); |
В случае отсутствия ошибок MongoDB никак не сообщит о том, что обновление записи прошло успешно. Чтобы убедиться воочию, сделаем запрос:
1 |
db.nettuts.find({first: 'james', last: 'caan'}); |
Как видим, всё прошло успешно. Одно важное замечание: если вы опустите модификатор $set, то запись будет замещена записью с полями, указанными во втором параметре метода upadte (), а не обновлена, как вы того можете ожидать>. Будьте внимательны.
Удаление записей
Думаю, вы уже начинаете представлять, как работать с MongoDB. В этом разделе рассмотрим метод удаления записей. Чтобы удалить определённые записи из БД, вам потребуется при помощи селекторов определить критерии выборки удаляемых записей: суть та же, что и в инструкции DELETE традиционного SQL. Обратите внимание, что если вы не передадите методу remove () в качестве параметра ни одного селектора, будут удалены все записи базы данных, а затем и вся БД.
Итак, предположим. нам потребовалось удалить James Caan из нашего списка актёров. Делается это одной командой:
1 |
db.nettuts.remove({first: 'james', last: 'caan'}); |
Так же, как и с update (), вы не получите ничего в ответ, так что давайте на всякий случай убедимся, удалилась ли нужная запись или нет:
1 |
db.nettuts.find({first: 'james', last: 'caan'}); |
Если удаление прошло успешно, вы не увидите ничего в ответ.
И в завершение наших сегодняшних экспериментов, давайте удалим все оставшиеся записи и саму БД. Как говорилось выше, сделать это можно вызовом метода remove () без параметров:
1 |
db.nettuts.remove(); |
Теперь, если вы попробуете получить спсиок записей нашей БД, вы не увидите ничего в ответ, что говорит о том, что все записи и БД были удалены:
Итоги
В сегодняшней кратенькой заметке мы с вами:
- узнали что такое MongoDB;
- установили её;
- научились создавать, выбирать, изменять и удалять записи
Владея этим базовым багажом знаний, вы можете начать погружение в удивительный мир MongoDB. Если вас заинтересовала Mongo, вы можете получить больше информации на официальном веб-сайте или в твиттере.
В следующий раз мы с вами займёмся изучением более сложных запросов. Stay tuned и большое вам спасибо, что были с нами ;)
Why cackle? У тебя же нет простынь комментариев, чтобы жаловаться на время загрузки disqus?
Название сервиса ржачное ;)
Да и вообще, поддерживаю отечественного производителя, как могу.
Прошу прощение за занудство, в Ваших примерах полно ошибок: текст не совпадает с запросами.
Да собственно, прощения просить не за что. Я всегда рад замечаниям и комментариям по делу. Но уж если говорите «полно ошибок», то, если не трудно, укажите где именно.
глазами пробежался по скриптам начиная с «мужчин англичан». Вы ищите либо мужчин, либо англичан.(or -> and), а дальше при остальных операциях у меня одни FIND светились, а сейчас вижу, что есть и UPDATE и прочие. за «полно ошибок» прошу извинить, обознался.
Как раз в том фрагменте выполняется поиск всех мужчин, а далее идёт массив из двух национальностей: американцев и англичан, завёрнутый в селектор $or. Чуть ниже приведён вывод результатов запроса, в котором видно, что выбраны и американцы и англичане.
Ну и спасибо за внимание к статье в любом случае, от ошибок не застрахован никто ;)
Спасибо ОГРОМНЕЙШЕЕ автору!!!!!!!!!!!!!!!!
Задали тему диплома «Mongodb», уже крыша едит, ничегоне выходило,а тут почитала, попробывала и начало получаться!!!Появилась надежна на то что сделаю диплом сама!)))
Еше раз повторюсь, огромное спасибо автору за статью*))
=*
Рад, что вам пригодился перевод!