Согласно документации MongoDB, Map-Reduction — это парадигма обработки данных для объединения больших объемов данных в полезные агрегированные результаты. MongoDB использует команду mapReduce для операций уменьшения карты. MapReduce обычно используется для обработки больших наборов данных.
Команда MapReduce
Ниже приведен синтаксис базовой команды mapReduce —
>db.collection.mapReduce( function() {emit(key,value);}, //map function function(key,values) {return reduceFunction}, { //reduce function out: collection, query: document, sort: document, limit: number } )
Функция map-Reduce сначала запрашивает коллекцию, а затем отображает итоговые документы для генерации пар ключ-значение, которые затем уменьшаются на основе ключей, которые имеют несколько значений.
В приведенном выше синтаксисе —
-
map — это функция JavaScript, которая отображает значение с ключом и испускает пару ключ-значение
-
Reduce — это функция JavaScript, которая уменьшает или группирует все документы, имеющие одинаковый ключ.
-
out указывает местоположение результата запроса на уменьшение карты
-
В запросе указываются необязательные критерии выбора для выбора документов.
-
sort определяет необязательные критерии сортировки
-
Лимит определяет необязательное максимальное количество документов, которые будут возвращены
map — это функция JavaScript, которая отображает значение с ключом и испускает пару ключ-значение
Reduce — это функция JavaScript, которая уменьшает или группирует все документы, имеющие одинаковый ключ.
out указывает местоположение результата запроса на уменьшение карты
В запросе указываются необязательные критерии выбора для выбора документов.
sort определяет необязательные критерии сортировки
Лимит определяет необязательное максимальное количество документов, которые будут возвращены
Использование MapReduce
Рассмотрим следующую структуру документа, в которой хранятся сообщения пользователей. Документ хранит user_name пользователя и статус поста.
{ "post_text": "tutorialspoint is an awesome website for tutorials", "user_name": "mark", "status":"active" }
Теперь мы будем использовать функцию mapReduce в нашей коллекции постов, чтобы выбрать все активные посты, сгруппировать их по имени пользователя и затем подсчитать количество постов каждого пользователя, используя следующий код —
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Приведенный выше запрос mapReduce выдает следующий результат:
{ "result" : "post_total", "timeMillis" : 9, "counts" : { "input" : 4, "emit" : 4, "reduce" : 2, "output" : 2 }, "ok" : 1, }
Результат показывает, что всего 4 документа соответствовали запросу (статус: «активный»), функция карты выдавала 4 документа с парами ключ-значение и, наконец, функция уменьшения сгруппировала сопоставленные документы с одинаковыми ключами в 2.
Чтобы увидеть результат этого запроса mapReduce, используйте оператор find —
>db.posts.mapReduce( function() { emit(this.user_id,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
Приведенный выше запрос дает следующий результат, который указывает на то, что оба пользователя tom и mark имеют два сообщения в активных состояниях —
{ "_id" : "tom", "value" : 2 } { "_id" : "mark", "value" : 2 }
Аналогичным образом запросы MapReduce можно использовать для построения больших сложных запросов агрегации. Использование пользовательских функций Javascript делает использование MapReduce очень гибким и мощным.