MongoDB Карта Уменьшить
Map-Reduce является вычислительная модель, просто означает, что основная часть работы (данные) разложения (MAP) для выполнения, а затем объединить результаты в конечный результат (УМЕНЬШИТЬ).
MongoDB обеспечивает 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 } )
Использование функций MapReduce для достижения двух функций Карта и уменьшить функции, вызов функции Map испускают (ключ, значение), пройти сбор всех записей, а значение ключа передается функции Reduce для обработки.
Функция Map должна вызвать испускают (ключ, значение) Возвращает пары.
Параметр Описание:
- Функция отображения (генерировать последовательности клавиш как уменьшить параметрыфункции): отображение.
- сократить статистические функции, задача состоит в том, чтобы уменьшить функциональную клавишу-значения в ключ-значение, то есть массив значений в единое значение стоимости.,
- из статистических результатов сохраненного набора (не определяет использование временного сбора автоматически удаляются после того, как клиент отключен).
- условие фильтразапроса, только для выполнения условий документа будет называться функция карты.(Query.limit, сортировки может смешать)
- сортировать и предел связывания своего рода своего рода параметр (также бывший документ , отправленный на функцию карты для сортировки), вы можете оптимизировать группировку механизма
- ограничить количество документов , переданных в верхний предел функции карты (если не существует никаких ограничений, в одиночку рода мало пользы)
Использование MapReduce
Рассмотрим следующую структуру документа для хранения данных пользователя статей, документов и сохраняет поле статуса статьи пользователя user_name:
>db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"active" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "mark", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"disabled" }) WriteResult({ "nInserted" : 1 }) >db.posts.insert({ "post_text": "本教程,最全的技术文档。", "user_name": "w3big", "status":"active" }) WriteResult({ "nInserted" : 1 })
Теперь мы будем использовать посты, установленные функции MapReduce, чтобы выбрать опубликованную статью (статус: «активный»), а user_name пакета рассчитывается для каждого пользователя Сообщений:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } )
Над MapReduce выход:
{ "result" : "post_total", "timeMillis" : 23, "counts" : { "input" : 5, "emit" : 5, "reduce" : 1, "output" : 2 }, "ok" : 1 }
Результаты показали, что в общей сложности четыре соответствуют критериям запроса (статус: "активные") документы генерируются четыре ключа в функции отображения в документе, а затем использовать ту же самую функцию, чтобы уменьшить ключ разделить на две группы.
Конкретные параметры:
- Результат: хранить результаты название коллекции, это временный набор назад от автоматического подключения MapReduce был удален.
- timeMillis: выполнение занимает много времени, в миллисекундах
- вход: состояние номер документа передается функции карты
- испускают: раз в функции карты испускают называется, то есть общая сумма всех сбора данных
- Ouput: Результаты Количество документов в коллекции (количество очень полезно для отладки)
- ОК: успех, успех 1
- ERR: Если это не удается, то может быть причина потерпеть неудачу, но из опыта, причиной является расплывчатым, не очень полезно
Использование оператора найти для просмотра результатов запроса MapReduce из:
>db.posts.mapReduce( function() { emit(this.user_name,1); }, function(key, values) {return Array.sum(values)}, { query:{status:"active"}, out:"post_total" } ).find()
Результаты вышеупомянутого запроса будет показано ниже, есть два пользователя индюки и отметьте две статьи, опубликованные:
{ "_id" : "mark", "value" : 4 } { "_id" : "w3big", "value" : 1 }
Аналогичным образом, MapReduce могут быть использованы для создания больших и сложных агрегатные запросы.
Карта функций и уменьшения функции могут быть реализованы с использованием JavaScript, MapReduce использовать очень гибкий и мощный.