(также опубликовано в блоге 10gen здесь )
В этой записи блога вы познакомитесь с кратким набором примеров структуры агрегации в оболочке mongo Javascript для базы данных 2.1, размещенной на MongoLab. Фреймворк включает в себя операторы агрегации $ project, $ unwind, $ group и другие. Эти операторы позволяют вычислять значения по всем документам в коллекции, такие как средние и суммы. Они также позволяют изменять форму документов, распаковывать вложенные структуры и перегруппировать их по мере необходимости.
Среда агрегации, одна из самых мощных и ожидаемых функций в готовящемся выпуске MongoDB 2.2, позволяет создавать конвейер обработки на стороне сервера, который будет выполняться в коллекции. Богатый набор операций доступен для включения в конвейер для достижения различных видов преобразований сбора, от простых многодокументных вычислений (например, сумм и средних значений) до сложных проекций и опорных точек.
Среда прекрасно вписывается в ряд инструментов манипулирования данными, доступных в MongoDB, от базовых встроенных функций, таких как подсчет документов до map-Reduce и Javascript, до пользовательского кода и пакетов для конкретного языка, включая Hadoop.
обзор
- Создать базу данных 2.1 MongoLab с вашим собственным уникальным именем, скажем, <myaggdemo>. Инструкции о том, как это сделать, находятся здесь . Вам понадобится ваше имя пользователя и пароль mongod.
- На домашней странице вашей базы данных скопируйте соединение оболочки mongo в буфер обмена.
- git clone git: //gist.github.com/1401585.git aggdemo; CD Aggdemo
- Отредактируйте article.js и aggregation.js, чтобы использовать вашу базу данных <myaggdemo>
- mongo <ваше соединение> -u <имя пользователя mongod> -p <пароль mongod> article.js (вставляет данные в вашу базу данных, 3 документа)
- mongo —shell <ваше соединение> -u <имя пользователя mongod> -p <пароль mongod> aggregation.js (выполняет несколько примеров агрегации и оставляет вас в оболочке mongo.)
- Введите g1 в оболочке mongo, чтобы увидеть первый результат $ group, обсуждаемый ниже.
(Я проверил это для работы с клиентом Монго версии 2.0.6 и новейшим клиентом Монго версии 2.1.2.)
Фрагменты кода
articles.js
/* sample articles for aggregation demonstrations */ // make sure we're using the right db; this is the same as "use mydb;" in shell db = db.getSiblingDB("aggdb"); //Put your MongoLab database name here. db.article.drop(); db.article.save( { title : "this is my title" , author : "bob" , posted : new Date(1079895594000) , pageViews : 5 , tags : [ "fun" , "good" , "fun" ] , comments : [ { author :"joe" , text : "this is cool" } , { author :"sam" , text : "this is bad" } ], other : { foo : 5 } }); //...snip
aggregation.js
// make sure we're using the right db; this is the same as "use aggdb;" in shell db = db.getSiblingDB("aggdb"); //Put your MongoLab database name here. // ...snip... // grouping var g1 = db.runCommand( { aggregate : "article", pipeline : [ { $project : { author : 1, tags : 1, pageViews : 1 }}, { $unwind : "$tags" }, { $group : { _id : "$tags", docsByTag : { $sum : 1 }, viewsByTag : { $sum : "$pageViews" }, mostViewsByTag : { $max : "$pageViews" }, avgByTag : { $avg : "$pageViews" } }} ]}); // ...snip
результат агрегации g1
{ "result" : [ //...snip... { "_id" : "fun", "docsByTag" : 3, "viewsByTag" : 17, "mostViewsByTag" : 7, "avgByTag" : 5.666666666666667 } ], "Ok" : 1 }
- Рекомендую Крису Вестину, архитектору 10gen для структуры агрегации для предоставления этих примеров
- Смотрите также его презентацию здесь .
обсуждение
Результаты агрегирования сохраняются в удобные переменные для проверки. Групповые операции (g1 и g5) в конце файла aggregation.js заслуживают внимания, поскольку они объединяют три оператора в общий пример сводки и агрегирования. Поток данных g1 показан выше. Нажмите на нее для увеличения .png версии или здесь для .pdf версии .
- Collection -> Intermediate-1: сначала используя исходную коллекцию документов в качестве входных данных, g1 использует $ project для фильтрации полей списка документов, чтобы они включали только поля author, tags и pageViews. Вывод показан в Промежуточном-1.
- Intermediate-1 -> Intermediate-2: Затем g1 $ разматывает Intermediate-1 массивом встроенных тегов, чтобы каждый тег создавал свой собственный документ с выводом, показанным в Intermediate-2.
- Промежуточный-2 -> Результат: затем g1 использует оператор $ group для создания списка документов по каждому экземпляру тега, вычисляя статистику, такую как общее и среднее количество просмотров страниц, показанное как Результат.
(Обратите внимание, что обе промежуточные формы являются внутренними для обработчика и не видны непосредственно оболочке; промежуточный-2 фактически показан в качестве примера p2.)
Для другого примера вы можете посмотреть на g5. Он также поворачивается на встроенных массивах тегов, но на этот раз сворачивает авторов в виде встроенных массивов, используя $ addToSet, по сути завершая сводку.
NB: есть небольшая ошибка в дизайне агрегации g1. Первый объект имеет тег «fun» дважды. Я намеренно выбрал этот, так как он показывает, как $ unwind дублирует «fun» в выходных данных Intermediate-2 для первого документа, что означает, что его агрегаты учитываются дважды. Бесплатная футболка MongoLab для первого человека, который может исправить код, чтобы правильно рассчитать агрегаты. Введите в комментариях. (@ cwestin63, вы дисквалифицированы; вы все равно получите футболку)
Резюме
Структура агрегации MongoDB 2.1 — это мощный механизм, который может помочь вам ответить на вопросы по всем документам. Он будет готов к работе в следующем выпуске 2.2, и вы можете попробовать его с минимальным риском, используя размещенный на хосте MongoLab экспериментальный сервис. Счастливого объединения!
(Обновление 2012-07-10 не исправляет отступы в aggregation.js для правильного форматирования. 2012-07-11 Переупорядоченные изображения. )