Согласно документации 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 очень гибким и мощным.