Статьи

Пример структуры агрегации

(также опубликовано в блоге 10gen здесь )

В этой записи блога вы познакомитесь с кратким набором примеров структуры агрегации в оболочке mongo Javascript для базы данных 2.1, размещенной на MongoLab. Фреймворк включает в себя операторы агрегации $ project, $ unwind, $ group и другие. Эти операторы позволяют вычислять значения по всем документам в коллекции, такие как средние и суммы. Они также позволяют изменять форму документов, распаковывать вложенные структуры и перегруппировать их по мере необходимости.

Среда агрегации, одна из самых мощных и ожидаемых функций в готовящемся выпуске MongoDB 2.2, позволяет создавать конвейер обработки на стороне сервера, который будет выполняться в коллекции. Богатый набор операций доступен для включения в конвейер для достижения различных видов преобразований сбора, от простых многодокументных вычислений (например, сумм и средних значений) до сложных проекций и опорных точек.

Среда прекрасно вписывается в ряд инструментов манипулирования данными, доступных в MongoDB, от базовых встроенных функций, таких как подсчет документов до map-Reduce и Javascript, до пользовательского кода и пакетов для конкретного языка, включая Hadoop.

обзор

  1. Создать базу данных 2.1 MongoLab с вашим собственным уникальным именем, скажем, <myaggdemo>. Инструкции о том, как это сделать, находятся  здесь . Вам понадобится ваше имя пользователя и пароль mongod.
  2. На домашней странице вашей базы данных скопируйте соединение оболочки mongo в буфер обмена.
  3. git clone git: //gist.github.com/1401585.git aggdemo; CD Aggdemo
  4. Отредактируйте article.js и aggregation.js, чтобы использовать вашу базу данных <myaggdemo>
  5. mongo <ваше соединение> -u <имя пользователя mongod> -p <пароль mongod> article.js   (вставляет данные в вашу базу данных, 3 документа)
  6. mongo —shell <ваше соединение> -u <имя пользователя mongod> -p <пароль mongod> aggregation.js (выполняет несколько примеров агрегации и оставляет вас в оболочке mongo.)
  7. Введите 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 версии .

  1. Collection -> Intermediate-1:  сначала используя исходную коллекцию документов в качестве входных данных, g1 использует $ project для фильтрации полей списка документов, чтобы они включали только поля author, tags и pageViews. Вывод показан в Промежуточном-1.
  2. Intermediate-1 -> Intermediate-2:  Затем g1 $ разматывает Intermediate-1 массивом встроенных тегов, чтобы каждый тег создавал свой собственный документ с выводом, показанным в Intermediate-2.
  3. Промежуточный-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 Переупорядоченные изображения. )