English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основное руководство по MongoDB

Дополнительное руководство по MongoDB

Команда mapReduce MongoDB

Согласно документации MongoDB, Map reduce - это парадигма обработки данных, используемая для сжатия большого объема данных в полезные агрегированные результаты. MongoDB использует команду mapReduce для выполнения операций map reduce. MapReduce обычно используется для обработки больших объемов данных.

Команда 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 Указать максимальное количество возвращаемых документов

Использование MapReduce

Рассмотрим структуру документа, хранящего посты пользователей. Этот документ хранит 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 очень гибко и мощно.