English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Согласно документации MongoDB, Map reduce - это парадигма обработки данных, используемая для сжатия большого объема данных в полезные агрегированные результаты. MongoDB использует команду mapReduce для выполнения операций map reduce. MapReduce обычно используется для обработки больших объемов данных.
Вот грамматика базового команды mapReduce-
>db.collection.mapReduce( function() { emit(key, value); }, //map функция function(key, values) { return reduceFunction }, { //reduce функция out: collection, query: document, sort: document, limit: number } )
Функция map-reduce сначала запрашивает набор, затем отображает результаты документов для emissions ключ-значение и затем сокращает их по ключам с несколькими значениями.
В приведенной выше грамматике-
map
Это функция JavaScript, которая映射ет ключ к значению и emits ключ-значение
reduce
Это функция JavaScript, которая используется для уменьшения или группировки всех документов с одинаковыми ключами
out
Указать положение результатов запроса map-reduce
query
Указать стандарт выбора документов
sort
Указать условие сортировки
limit
Указать максимальное количество возвращаемых документов
Рассмотрим структуру документа, хранящего посты пользователей. Этот документ хранит user_name и статус публикации.
{ "post_text": "w3codebox — это потрясающий сайт для учебников", "user_name": "mark", "status": "active" }
Теперь мы будем использоватьposts
Функция mapReduce используется для выбора всех активных постов в наборе, их группировки по 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 документа соответствуют запросу (status: "active"), функция map отправляет 4 документа с парными значениями ключей, а функция reduce в конце разделяет документы с одинаковыми ключами на 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 есть два активных post –
{"_id" : "tom", "value" : 2} {"_id" : "mark", "value" : 2}
Таким образом, запросы MapReduce можно использовать для создания сложных агрегационных запросов. Использование пользовательских функций JavaScript с MapReduce очень гибко и мощно.