Запросы в MongoDB
Запросы в MongoDB
Используя объектно-ориентированный подход в разработке ПО, мы разделяем проектируемую систему на логические составляющие для того, чтобы составить умозрительную концепцию в своей голове. Получая эту концепцию нам становится проще определить границы логических операций над данными, а также структуру и состояния самих данных в тот или иной момент времени.
Представьте себе, что у вас есть возможность программно оперировать логическими моделями почти в неизменном виде вместо того, чтобы превращать их в набор таблиц, поле и строк реляционной базы данных?
Рассмотрим такие операции, как создание, изменение и удаление баз данных и записей, а также более сложными вещами — сложными выборками данных и анализом при помощи MapReduce.
Установка MongoDB
Загрузить MongoDB для своей платформы можно в соответствующем разделе их сайта или же порыться в репозиториях своего дистрибутива. Будем использовать Arch Linux, где всё необходимое было установлено одной командой:
1
|
sudo pacman -S mongodb
|
После успешной установки необходимо запустить сервер MongoDB:
1
|
sudo pacman rc.d start mongodb
|
Всё.
Запускаем в терминале
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 — одной из лучших реализаций NoSQL СУБД. Мы разорались как её установить, создать простую базу данных и научились выполнять базовые операции над записями: вставлять, изменять и удалять их.
Продолжая начатое, в этой заметке мы рассмотрим продвинутые приёмы работы с MongoDB, используя селекторы. В виде селекторов мы получаем в руки мощный инструмент, позволяющий выполнять более гибкие и точные выборки записей, что даёт возможность получать требуемые данные за меньшее количество операций.
Всё это прекрасно, конечно, но для использования MongoDB в разработке приложений вам понадобится побольше знаний, чем автор предлагает вам в этих статьях. Автор понимает это и в недалёком будущем обязательно расскажет вам как использовать MongoDB при построении отличных приложений. А пока что наша с вами задача — дать вам привыкнуть в документ-ориентированному подходу и разобраться с базовыми методами работы с MongoDB.
Итак, сегодня я собираюсь расширить тему выборки записей, начатую в прошлой заметке и раскрыть перед вами два новых аспекта MongoDB: расширенные запросы и MapReduce.
Расширенные запросы
Ранее мы рассмотрели простые запросы и краем уха коснулись селекторов. Теперь мы поболее углубимся в технику построения запросов, выполнив те же самые действия, но используя условные операторы и регулярные выражения. Каждая из этих двух техник даёт возможность строить более точные запросы и, как следствие, получать более точные результаты в результате их выполнения.
Условные операторы
Как можно догадаться из названия, условные операторы — это нечто, что позволяет модифицировать запросы таким образом. чтобы их результаты соответствовали определённым условиям, операторами заданными. В сегодняшней заметке мы рассмотрим 9 основных из них:
- $lt — значение должно быть менее чем задано;
- $gt — значение должно быть более чем задано;
- $lte — значение должно быть менее чем или равно заданному;
- $gte — значение должно быть более чем или равно заданному;
- $in — значение должно попадать в заданный диапазон;
- $nin — значение не должно попадать в заданный диапазон;
- $not — значение должно быть не равно заданному.
Далее мы с вами посмотрим, каким образом работает каждый из этих операторов. Для работы нам понадобится БД, созданная нами в прошлой заметке, естественно, без изменений. Прежде, чем двинемся дальше, нам понадобится немного модифицировать созданную ранее БД, добавив поля возраста каждому актёру.Запустите mongo shell и выполните следующий запрос:
1
2
3
4
5
6
7
|
db.nettuts.update({"first" : "matthew", "last" : "setter"}, {"$set" : {"age" : 18 }});
db.nettuts.update({"first" : "james", "last" : "caan"}, {"$set" : {"age" : 45 }});
db.nettuts.update({"first" : "arnold", "last" : "schwarzenegger"}, {"$set" : {"age" : 65 }});
db.nettuts.update({"first" : "tony", "last" : "curtis"}, {"$set" : {"age" : 43 }});
db.nettuts.update({"first" : "jamie lee", "last" : "curtis"}, {"$set" : {"age" : 22 }});
db.nettuts.update({"first" : "michael", "last" : "caine"}, {"$set" : {"age" : 33 }});
db.nettuts.update({"first" : "judi", "last" : "dench"}, {"$set" : {"age" : 33 }});
|
По традиции проверим, всё ли у нас так, как мы ожидаем:
1
2
3
4
5
6
7
8
|
db.nettuts.find();
{ "_id" : ObjectId("50a904bfac90401f3473b501"), "age" : 18, "dob" : "21/04/1978", "first" : "matthew", "gender" : "m", "hair_colour" : "brown", "last" : "setter", "nationality" : "australian", "occupation" : "developer" }
{ "_id" : ObjectId("50a904bfac90401f3473b502"), "age" : 45, "dob" : "26/03/1940", "first" : "james", "gender" : "m", "hair_colour" : "brown", "last" : "caan", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904bfac90401f3473b503"), "age" : 65, "dob" : "03/06/1925", "first" : "arnold", "gender" : "m", "hair_colour" : "brown", "last" : "schwarzenegger", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904bfac90401f3473b504"), "age" : 43, "dob" : "21/04/1978", "first" : "tony", "gender" : "m", "hair_colour" : "brown", "last" : "curtis", "nationality" : "american", "occupation" : "developer" }
{ "_id" : ObjectId("50a904bfac90401f3473b505"), "age" : 22, "dob" : "22/11/1958", "first" : "jamie lee", "gender" : "f", "hair_colour" : "brown", "last" : "curtis", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904c0ac90401f3473b507"), "age" : 33, "dob" : "09/12/1934", "first" : "judi", "gender" : "f", "hair_colour" : "white", "last" : "dench", "nationality" : "english", "occupation" : "actress" }
{ "_id" : ObjectId("50a904bfac90401f3473b506"), "age" : 33, "dob" : "14/03/1933", "first" : "michael", "gender" : "m", "hair_colour" : "brown", "last" : "caine", "nationality" : "english", "occupation" : "actor" }
|
$lt/$lte
Теперь давайте выберем всех актёров, кому ещё не стукнуло сорок:
1
2
3
4
5
|
db.nettuts.find( { "age" : { "$lt" : 40 } } );
{ "_id" : ObjectId("50a904bfac90401f3473b501"), "age" : 18, "dob" : "21/04/1978", "first" : "matthew", "gender" : "m", "hair_colour" : "brown", "last" : "setter", "nationality" : "australian", "occupation" : "developer" }
{ "_id" : ObjectId("50a904bfac90401f3473b505"), "age" : 22, "dob" : "22/11/1958", "first" : "jamie lee", "gender" : "f", "hair_colour" : "brown", "last" : "curtis", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904c0ac90401f3473b507"), "age" : 33, "dob" : "09/12/1934", "first" : "judi", "gender" : "f", "hair_colour" : "white", "last" : "dench", "nationality" : "english", "occupation" : "actress" }
{ "_id" : ObjectId("50a904bfac90401f3473b506"), "age" : 33, "dob" : "14/03/1933", "first" : "michael", "gender" : "m", "hair_colour" : "brown", "last" : "caine", "nationality" : "english", "occupation" : "actor" }
|
А теперь всех, кому 43 и менее:
1
2
3
4
5
6
|
db.nettuts.find( { "age" : { "$lte" : 43 } } );
{ "_id" : ObjectId("50a904bfac90401f3473b501"), "age" : 18, "dob" : "21/04/1978", "first" : "matthew", "gender" : "m", "hair_colour" : "brown", "last" : "setter", "nationality" : "australian", "occupation" : "developer" }
{ "_id" : ObjectId("50a904bfac90401f3473b504"), "age" : 43, "dob" : "21/04/1978", "first" : "tony", "gender" : "m", "hair_colour" : "brown", "last" : "curtis", "nationality" : "american", "occupation" : "developer" }
{ "_id" : ObjectId("50a904bfac90401f3473b505"), "age" : 22, "dob" : "22/11/1958", "first" : "jamie lee", "gender" : "f", "hair_colour" : "brown", "last" : "curtis", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904c0ac90401f3473b507"), "age" : 33, "dob" : "09/12/1934", "first" : "judi", "gender" : "f", "hair_colour" : "white", "last" : "dench", "nationality" : "english", "occupation" : "actress" }
{ "_id" : ObjectId("50a904bfac90401f3473b506"), "age" : 33, "dob" : "14/03/1933", "first" : "michael", "gender" : "m", "hair_colour" : "brown", "last" : "caine", "nationality" : "english", "occupation" : "actor" }
|
$gt/$gte
Все актёры, кому больше сорока семи:
1
2
|
db.nettuts.find( { "age" : { "$gt" : 47 } } );
{ "_id" : ObjectId("50a904bfac90401f3473b503"), "age" : 65, "dob" : "03/06/1925", "first" : "arnold", "gender" : "m", "hair_colour" : "brown", "last" : "schwarzenegger", "nationality" : "american", "occupation" : "actor" }
|
Все, кому 45 и более:
1
2
3
|
db.nettuts.find( { "age" : { "$gte" : 45 } } );
{ "_id" : ObjectId("50a904bfac90401f3473b502"), "age" : 45, "dob" : "26/03/1940", "first" : "james", "gender" : "m", "hair_colour" : "brown", "last" : "caan", "nationality" : "american", "occupation" : "actor" }
{ "_id" : ObjectId("50a904bfac90401f3473b503"), "age" : 65, "dob" : "03/06/1925", "first" : "arnold", "gender" : "m", "hair_colour" : "brown", "last" : "schwarzenegger", "nationality" : "american", "occupation" : "actor" }
|
$in/$nin
Поехали дальше. Как насчёт выборки по списку критериев? Представим, что нам нужно получить список людей. которые являются либо актёрами, либо разработчиками. При помощи следующего запроса сделаем это (с целью повысить удобочитаемость вывода, ограничим вывод только именем и фамилией):
1
2
3
4
5
6
7
|
db.nettuts.find( { "occupation" : { "$in" : [ "actor", "developer" ] } }, { "first" : 1, "last" : 1 } );
{ "_id" : ObjectId("50a904bfac90401f3473b501"), "first" : "matthew", "last" : "setter" }
{ "_id" : ObjectId("50a904bfac90401f3473b502"), "first" : "james", "last" : "caan" }
{ "_id" : ObjectId("50a904bfac90401f3473b503"), "first" : "arnold", "last" : "schwarzenegger" }
{ "_id" : ObjectId("50a904bfac90401f3473b504"), "first" : "tony", "last" : "curtis" }
{ "_id" : ObjectId("50a904bfac90401f3473b505"), "first" : "jamie lee", "last" : "curtis" }
{ "_id" : ObjectId("50a904bfac90401f3473b506"), "first" : "michael", "last" : "caine" }
|
И, не отходя от кассы. помотрим как работает $nin:
1
2
|
db.nettuts.find( { "occupation" : { "$nin" : [ "actor", "developer" ] } }, { "first" : 1, "last" : 1 } );
{ "_id" : ObjectId("50a904c0ac90401f3473b507"), "first" : "judi", "last" : "dench" }
|
Давайте теперь попробуем что-нибудь посложнее. Скажем, нам понадобилось отыскать всех, кто либо мужчина, либо разработчик и при этом этой персоне меньше сорока. Это может показаться слегка сложным, однако для того, чтобы построить соответствующий запрос, у вас имеется всё необходимое. Смотрите:
1
2
|
db.nettuts.find( { $or : [ { "gender" : "m", "occupation" : "developer" } ], "age" : { "$gt" : 40 } }, { "first" : 1, "last" : 1, "occupation" : 1, "dob" : 1 } );
{ "_id" : ObjectId("50a904bfac90401f3473b504"), "dob" : "21/04/1978", "first" : "tony", "last" : "curtis", "occupation" : "developer" }
|
Как вы видите, мы сперва добавили условие ИЛИ при помощи оператора $or, а затем добавили условие И, определив нижний предел возраста.
Регулярные выражения
К этому моменту я уже не сомневаюсь в том, что вы вряд ли удовлетворитесь лишь тем, что узнали. Также я обещал вам поведать о более продвинутых способах работы с MongoDB. Что ж, давайте посмотрим, как в MongoDB можно использовать регулярные выражения.
Скажем, вам понадобилось отыскать пользователей, у которых имя начинается с 'ma' или 'to', а фамилия оканчивается на 'se' или 'de'. Как вам выбрать записи удовлетворяющие таким критериям? Здесь нам и помогут регулярные выражения, смотрите:
1
2
3
|
db.nettuts.find( { "first" : /(ma|to)*/i, "last" : /(se|de)/i } );
{ "_id" : ObjectId("50a904bfac90401f3473b501"), "age" : 18, "dob" : "21/04/1978", "first" : "matthew", "gender" : "m", "hair_colour" : "brown", "last" : "setter", "nationality" : "australian", "occupation" : "developer" }
{ "_id" : ObjectId("50a904c0ac90401f3473b507"), "age" : 33, "dob" : "09/12/1934", "first" : "judi", "gender" : "f", "hair_colour" : "white", "last" : "dench", "nationality" : "english", "occupation" : "actress" }
|
Тема регулярных выражений выходит за рамки данной статьи, и чтобы лишний раз не путать новичков огрызками информации, крайне рекомендуется посвятить несколько часов своей жизни на то, чтобы разобраться с тем, что такое регулярные выражения и с чем их едят.
MapReduce
MapReduce — это «большой папа» в мире технологий анализа данных. В двух словах, MapReduce — это процесс агрегации данных разделёных в кластере вычислительных систем, что даёт возможность параллельной обработки данных и, как следствие — значительное сокращение времени получения результатов.
Сам процесс разделён на две части: Map и Reduce. На этапе Map создаётся набор заданий, которые затем передаются узлам кластера для обработки. По мере получения ответных данных от узлов кластера, этап Reduce выполняет свёртку данных. Более подробно об этом процессе можно почитать в Википедии.
Пример использования MapReduce
Давайте рассмотрим простой пример. Мы проанализируем наш набор данных и вычислим общее количество особей женского пола. Насмотря на свою простоту, этот пример поможет вам понять суть идеи MapReduce и увидеть на практике как это работает.
Map-функция
Здесь мы создадим map-функцию, которая объединяет в пары ключ-значение поля записей 'gender' и единицу. Суть работы функции заключается в том, что в процессе MapReduce ей на этапе Map передаётся один документ из коллекции, а от функции ожидается пара ключ-значение, возвращаемая при помощи функции emit (). Таким образом map-функция вызывается столько раз, сколько документов в коллекции. Объект this внутри Map-функции представляет собой переданный документ.
1
2
3
|
var map = function() {
emit( { gender: this.gender }, { count: 1 } );
}
|
При каждом вызове map-функция будет выводить подобное:
1
|
{ 'f' : 1 }
|
Reduce-функция
После того, как все документы будут обработаны map-функцией, в дело вступает reduce-функция. Она вызывается столько раз, сколько получилось ключей на Map-этапе, в нашем случае — два: 'f' и 'm'. При каждом вызове reduce-функция получает два параметра: ключ и массив соответствующих значений, полученный на Map-этапе. Вот так выглядит наша reduce-функция:
1
2
3
4
5
6
7
|
var reduce = function(key, values) {
var result = { count : 0 };
values.forEach(function(value){
result.count += value.count;
})
return result;
}
|
Как видим, наша функция просто суммирует значения полей count, определённых на Map-этапе.
Запуск MapReduce
Теперь, когда map и reduce функции готовы, мы можем привести в действие MapReduce-механизм, вызовом одноимённой функции MapReduce (). Первым параметром функции должна быть ссылка на map-функцию, вторым — ссылка на reduce-функцию, затем — объект параметров работы MapReduce. В третьем параметре вы определим свойство out, которой определяет имя коллекций, в которую MapReduce () будет сохранять результат работы.
1
|
var res = db.nettuts.mapReduce( map, reduce, { out : 'gender' } );
|
Вывод результатов
После того, как MapReduce () завершит работу, мы можем получить доступ к результатам через коллекцию 'gender', имя которой мы определили при вызове mapReduce:
1
2
3
|
db.gender.find();
{ "_id" : { "gender" : "f" }, "value" : { "count" : 2 } }
{ "_id" : { "gender" : "m" }, "value" : { "count" : 5 } }
|
Если же нам, например, понадобится подсчитать количество только женщин, мы можем воспользоваться свойством query в третьем параметре вызова mapReduce ():
1
2
3
|
var res = db.nettuts.mapReduce( map, reduce, { out : 'gender', query : { "gender" : "f" } } );
db.gender.find();
{ "_id" : { "gender" : "f" }, "value" : { "count" : 2 } }
|
- sort — сортирует результаты;
- limit — ограничивает количество результатов;
- out — определяет имя коллекции, в которую сохраняются результаты;
- finalize — определяет функцию, вызываемую после завершения работы reduce-фнкции;
- scope — определяет набор переменных, видимых внутри функций map и reduce;
- jsMode — определяет необходимость конвертации промежуточных данных в BSON-формат между вызовами map и reduce-функций;
- verbose — управляет добавлением к результату свойства timing, содержащего статистическую информацию о процессе выполнения запроса.
Комментарии
Отправить комментарий