(также опубликовано в блоге 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 Переупорядоченные изображения. )
