MongoDB - уменьшение карты
Согласно документации MongoDB, Map-reduceпредставляет собой парадигму обработки данных для сжатия больших объемов данных в полезные агрегированные результаты. 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 указывает расположение результата запроса сокращения карты
query указывает дополнительные критерии выбора для выбора документов
sort указывает необязательные критерии сортировки
limit указывает необязательное максимальное количество возвращаемых документов
Использование MapReduce
Рассмотрим следующую структуру документа, в которой хранятся сообщения пользователей. В документе хранится user_name пользователя и статус сообщения.
{
"post_text": "tutorialspoint is an awesome website for tutorials",
"user_name": "mark",
"status":"active"
}
Теперь мы будем использовать функцию mapReduce на нашем posts коллекция, чтобы выбрать все активные сообщения, сгруппировать их на основе user_name, а затем подсчитать количество сообщений каждым пользователем, используя следующий код -
>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, используйте оператор поиска -
>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, который является очень гибким и мощным.