Начало работы с MongoDB, часть 2






В предыдущей заметке мы с вами начали разбираться с основами MongoDB — одной из лучших реализаций NoSQL СУБД. Мы разорались как её установить, создать простую базу данных и научились выполнять базовые операции над записями: вставлять, изменять и удалять их.

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

Всё это прекрасно, конечно, но для использования MongoDB в разработке приложений вам понадобится побольше знаний, чем автор предлагает вам в этих статьях. Автор понимает это и в недалёком будущем обязательно расскажет вам как использовать MongoDB при построении отличных приложений. А пока что наша с вами задача — дать вам привыкнуть в документ-ориентированному подходу и разобраться с базовыми методами работы с MongoDB.

Итак, сегодня я собираюсь расширить тему выборки записей, начатую в прошлой заметке и раскрыть перед  вами два новых аспекта MongoDB: расширенные запросы и MapReduce.


Расширенные запросы

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

Условные операторы

Как можно догадаться из названия, условные операторы — это нечто, что позволяет модифицировать запросы таким образом. чтобы их результаты соответствовали определённым условиям, операторами заданными. В сегодняшней заметке мы рассмотрим 9 основных из них:

  • $lt — значение должно быть менее чем задано;
  • $gt — значение должно быть более чем задано;
  • $lte — значение должно быть менее чем или равно заданному;
  • $gte — значение должно быть более чем или равно заданному;
  • $in — значение должно попадать в заданный диапазон;
  • $nin — значение не должно попадать в заданный диапазон;
  • $not — значение должно быть не равно заданному.

Далее мы с вами посмотрим, каким образом работает каждый из этих операторов. Для работы нам понадобится БД, созданная нами в прошлой заметке, естественно, без изменений. Прежде, чем двинемся дальше, нам понадобится немного модифицировать созданную ранее БД, добавив поля возраста каждому актёру.Запустите mongo shell и выполните следующий запрос:

По традиции проверим, всё ли у нас так, как мы ожидаем:

$lt/$lte

Теперь давайте выберем всех актёров, кому ещё не стукнуло сорок:

А теперь всех, кому 43 и менее:

$gt/$gte

Все актёры, кому больше сорока семи:

Все, кому 45 и более:

$in/$nin

Поехали дальше. Как насчёт выборки по списку критериев? Представим, что нам нужно получить список людей. которые являются либо актёрами, либо разработчиками. При помощи следующего запроса сделаем это (с целью повысить удобочитаемость вывода, ограничим вывод только именем и фамилией):

И, не отходя от кассы. помотрим как работает $nin:

Давайте теперь попробуем что-нибудь посложнее. Скажем, нам понадобилось отыскать всех, кто либо мужчина, либо разработчик и при этом этой персоне меньше сорока. Это может показаться слегка сложным, однако для того, чтобы построить соответствующий запрос, у вас имеется всё необходимое. Смотрите:

Как вы видите, мы сперва добавили условие ИЛИ при помощи оператора $or, а затем добавили условие И, определив нижний предел возраста.

Регулярные выражения

К этому моменту я уже не сомневаюсь в том, что вы вряд ли удовлетворитесь лишь тем, что узнали. Также я обещал вам поведать о более продвинутых способах работы с MongoDB. Что ж, давайте посмотрим, как в MongoDB можно использовать регулярные выражения.

Скажем, вам понадобилось отыскать пользователей, у которых имя начинается с 'ma' или 'to', а фамилия оканчивается на 'se' или 'de'. Как вам выбрать записи удовлетворяющие таким критериям? Здесь нам и помогут регулярные выражения, смотрите:

Тема регулярных выражений выходит за рамки данной статьи, и чтобы лишний раз не путать новичков огрызками информации, крайне рекомендуется посвятить несколько часов своей жизни на то, чтобы разобраться с тем, что такое регулярные выражения и с чем их едят.

MapReduce

MapReduce — это «большой папа» в мире технологий анализа данных. В двух словах, MapReduce — это процесс агрегации данных разделёных в кластере вычислительных систем, что даёт возможность параллельной обработки данных и, как следствие — значительное сокращение времени получения результатов.

Сам процесс разделён на две части: Map и Reduce. На этапе Map создаётся набор заданий, которые затем передаются узлам кластера для обработки. По мере получения ответных данных от узлов кластера, этап Reduce выполняет свёртку данных. Более подробно об этом процессе можно почитать в Википедии.

Пример использования MapReduce

Давайте рассмотрим простой пример. Мы проанализируем наш набор данных и вычислим общее количество особей женского пола. Насмотря на свою простоту, этот пример поможет вам понять суть идеи MapReduce и увидеть на практике как это работает.

Map-функция

Здесь мы создадим map-функцию, которая объединяет в пары ключ-значение поля записей 'gender' и единицу. Суть работы функции заключается в том, что в процессе MapReduce ей на этапе Map передаётся один документ из коллекции, а от функции ожидается пара ключ-значение, возвращаемая при помощи функции emit (). Таким образом map-функция вызывается столько раз, сколько документов в коллекции. Объект this внутри Map-функции представляет собой переданный документ.

При каждом вызове map-функция будет выводить подобное:

Reduce-функция

После того, как все документы будут обработаны map-функцией, в дело вступает reduce-функция. Она вызывается столько раз, сколько получилось ключей на Map-этапе, в нашем случае — два: 'f' и 'm'. При каждом вызове reduce-функция получает два параметра: ключ и массив соответствующих значений, полученный на Map-этапе. Вот так выглядит наша reduce-функция:

Как видим, наша функция просто суммирует значения полей count, определённых на Map-этапе.

Запуск MapReduce

Теперь, когда map и reduce функции готовы, мы можем привести в действие MapReduce-механизм, вызовом одноимённой функции MapReduce (). Первым параметром функции должна быть ссылка на map-функцию, вторым — ссылка на reduce-функцию, затем — объект параметров работы MapReduce. В третьем параметре вы определим свойство out, которой определяет имя коллекций, в которую MapReduce () будет сохранять результат работы.

 Вывод результатов

После того, как MapReduce () завершит работу, мы можем получить доступ к результатам через коллекцию 'gender', имя которой мы определили при вызове mapReduce:

Если же нам, например, понадобится подсчитать количество только женщин, мы можем воспользоваться свойством query в третьем параметре вызова mapReduce ():

Помимо query существует ещё несколько свойств, которыми можно управлять поведением MapReduce ():

  • sort — сортирует результаты;
  • limit — ограничивает количество результатов;
  • out — определяет имя коллекции, в которую сохраняются результаты;
  • finalize — определяет функцию, вызываемую после завершения работы reduce-фнкции;
  • scope — определяет набор переменных, видимых внутри функций map и reduce;
  • jsMode — определяет необходимость конвертации промежуточных данных в BSON-формат между вызовами map и reduce-функций;
  • verbose — управляет добавлением к результату свойства timing, содержащего статистическую информацию о процессе выполнения запроса.

В заключение

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

Источник




Начало работы с MongoDB, часть 2: 1 комментарий

Комментарии запрещены.