SlideShare a Scribd company logo
Aggregation framework
Игорь Визьма
@ivizma
●
Что такое Aggregation framework
Аггрегирующие операторы Наборы
аггрегирующих операторов Примеры
использования
Аналогии с SQL группирующими
функциями (GROUP BY)
●
●
●
●
Тезисы
● Группировка данных по определенным
признакам (GROUP)
Усреднение данных (AVG)
Суммирование данных (SUM)
Количество (COUNT)
Не работает с:
Binary, Symbol, MinKey, MaxKey, DBRef,
Code, CodeWScope
●
●
●
●
Aggregation
>db.collection.aggregate([
{$pipeline_1},
{$pipeline_2},
{$pipeline_3},
{$pipeline_n}
]);
>db.collection.aggregate({$pipeline_1});
Форма записи
Принцип работы
Данные, обрабатываемые
$pipeline1
Данные, обрабатываемые $pipeline2
Данные, обрабатываемые $pipeline3
●
$project – позволяет задать поля для выборки,
переименовать поля, операции над полем или полями
Аналог в SQL - SELECT
●
>db.collection.aggregate({
$project : {
_id : 0,
title : 1,
vat : {$multiply : ["$price", 0.75] },
full_price : {"$price"}
}
});
//get title as is
//custom field
//rename field
Операторы
●
$match – задать условия для выборки.
Используются аналогичные .find() операторы
Аналог SQL - WHERE, HAVING
●
●
>db.collection.aggregate([
{$match : { {price : {$gt : 100, $lt : 500}} },
{$project : {
title : 1, //get title as is
vat : {$multiply : ["$price", 0.75] }, //custom field vat full_price : {price :
"$price",
realprice : {$add : {"$price", "$personPrice"} } }
}
}
]);
Операторы
● {$limit : i} – количество документов (SQL – LIMIT i)
{$skip : n} - пропустить n документов (SQL – LIMIT n, i)
{$unwind : “$field”} - создать документ для каждого
элемента массива поля $field. Обычно используется с
$group
{$sort : {field : 1} } - cортировка данных
●
●
●
Операторы
●
$group - группирует данные по определенным полям.
Результат хранит в памяти.
Аналог SQL – GROUP BY
●
●
>db.collection.aggregate([
{$group : { _id : cpu_family, sold : {$sum : 1}, profit : {$sum : "$price"} },
{$match : { {sold : {$gt : 1000}} }, //use previous processed fields
{$project : {
title : "$cpu_family",
profit : "$profit"
}},
{$sort : {profit : -1} },
{$limit : 10}
]);
//get CPU family as title
*Показать ТОП-10 семейств процессоров, набравших наибольшие суммы доходов
и которых продано больше тысячи
Операторы
● $addToSet - уникальный массив данных
(GROUP_CONCAT(DISTINCT ...))
$first - первое значение, использовать только с $sort
$last - последнее значение, использовать только с $sort
$max - максимальное значение (SQL - MAX)
$min - минимальное not null значение.
До версии 2.4 возвращался null при наличии такового (SQL -
MIN).
$avg - усредненное значение
$push – не уникальный массив данных (SQL - GROUP_CONCAT
(...))
$sum - сумма значений или счетчик (SQL – SUM, COUNT)
●
●
●
●
●
●
●
Group Functions
MongoDB vs. SQL
mongoDB MySQL$match WHERE
$match HAVING
$group GROUP BY
$project SELECT
$sort ORDER BY
$limit LIMIT
$sum SUM
$sum COUNT
>db.collection.aggregate([
{ $group : { _id : cpu_family,
sold : {$sum : 1},
profit : {$sum : "$price"}}
// group by
// count
// sum },
{$match : {sold : {$gt : 1000} }}, //having count(`sold`)
{$project : { title : "$cpu_family",
profit : "$profit" }},
//`cpu_family` as `title`
//leave as is
{$sort : {profit : -1} },
{$limit : 10} ]);
//order by
//limit
SELECT `cpu_family` as `title`, SUM(`price`) as `profit`
FROM `table`
GROUP BY `cpu_family`
HAVING COUNT(`cpu_family`) > 1000
ORDER BY `profit` DESC LIMIT 10
MongoDB vs. SQL
>db.collection.aggregate([
{$project : { title : 1, cpu_family : 1, manufacturer : 1 }},
{$group : { _id : cpu_family,
alias : {$addToSet : "$title"}}
]);
SELECT GROUP_CONCAT(DISTINCT `title`) as `alias`
FROM `table` GROUP BY cpu_family
MongoDB vs. SQL
>db.collection.aggregate([
{ $unwind: "$items" },
{ $group: { _id: "$cust_id",
qty: { $sum: "$items.qty" } } }
]);
SELECT id, SUM(li.qty) as qty FROM orders o,
order_lineitem li WHERE li.order_id = o.id GROUP
BY cust_id
MongoDB vs. SQL
>db.collection.aggregate([
{ $match: { status: 'A' } },
{ $group: { _id: "$cust_id",
total: { $sum: "$price" } } },
{ $match: { total: { $gt: 250 } } }
]);
SELECT cust_id, SUM(price) as total
FROM orders WHERE status = 'A' GROUP BY
cust_id HAVING total > 250
MongoDB vs. SQL
Вопросы
Igor Vizma
@ivizma

More Related Content

What's hot (20)

PDF
пабсаб презентейшн
Alexey Osipenko
 
PDF
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
ODP
Server optimization
Yury Glushkov
 
ODP
Работа с БД в Drupal 7
Eugene Fidelin
 
PDF
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 
PPTX
Documents in JavaScript
Дмитрий Радыно
 
PPTX
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Victoria Malaya
 
PDF
13 - Web-технологии. Отображение данных
Roman Brovko
 
PPTX
I tmozg js_school_jquery
ITmozg
 
PDF
WordPress Cron API
versusbassz
 
PDF
msumobi2. Лекция 2
Глеб Тарасов
 
PDF
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
PPTX
Yii 2. Что нового?
yiiconf
 
PDF
msumobi2. Лекция 1
Глеб Тарасов
 
PDF
Python dict: прошлое, настоящее, будущее
delimitry
 
PPT
Yserver
drupalconf
 
PDF
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
PPT
Javascript
Vasya Petrov
 
PDF
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
PDF
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
Yandex
 
пабсаб презентейшн
Alexey Osipenko
 
Школа-студия разработки приложений для iOS. Лекция 1. Objective-C
Глеб Тарасов
 
Server optimization
Yury Glushkov
 
Работа с БД в Drupal 7
Eugene Fidelin
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 
Documents in JavaScript
Дмитрий Радыно
 
Transactions and Denormalization in MongoDB - Artem Slobolinsky - Dnipropetro...
Victoria Malaya
 
13 - Web-технологии. Отображение данных
Roman Brovko
 
I tmozg js_school_jquery
ITmozg
 
WordPress Cron API
versusbassz
 
msumobi2. Лекция 2
Глеб Тарасов
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
Yii 2. Что нового?
yiiconf
 
msumobi2. Лекция 1
Глеб Тарасов
 
Python dict: прошлое, настоящее, будущее
delimitry
 
Yserver
drupalconf
 
Встреча №8. NSIncrementalStore, или как заставить Core Data варить ваш собств...
CocoaHeads
 
Javascript
Vasya Petrov
 
Интуит. Разработка приложений для iOS. Лекция 8. Работа с данными
Глеб Тарасов
 
FrontTalks: Михаил Давыдов (Яндекс), «Promise – это не больно»
Yandex
 

Similar to Mongo db aggregation (20)

PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ivan Muratov
 
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
PDF
Web осень 2013 лекция 6
Technopark
 
PDF
Apache spark
Anton Anokhin
 
PPTX
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Evgeniy Kuzmin
 
PDF
Magento - Антон Капля
meet_magento
 
PDF
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
PPTX
#PostgreSQLRussia в банке Тинькофф, доклад №1
Nikolay Samokhvalov
 
PDF
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
PPTX
Быть в 10 раз эффективнее благодаря Groovy
Evgeny Kompaniyets
 
PDF
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
pgdayrussia
 
PDF
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Ontico
 
PPT
Базы данных лекция №8
Vitaliy Pak
 
PPTX
Расширение библиотеки Slick
Арсений Жижелев
 
PPTX
Cтрах и ненависть в MongoDB
Dmitry Viskov
 
PPT
Hadoop implementation in Wikimart
Roman Zykov
 
PPT
лабраб 7
Gulnaz Shakirova
 
PDF
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
Yandex
 
PDF
MongoDB@addconf
Sergei Tulentsev
 
PPTX
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ivan Muratov
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
CocoaHeads
 
Web осень 2013 лекция 6
Technopark
 
Apache spark
Anton Anokhin
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Evgeniy Kuzmin
 
Magento - Антон Капля
meet_magento
 
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
Nikolay Samokhvalov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Ontico
 
Быть в 10 раз эффективнее благодаря Groovy
Evgeny Kompaniyets
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
pgdayrussia
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Ontico
 
Базы данных лекция №8
Vitaliy Pak
 
Расширение библиотеки Slick
Арсений Жижелев
 
Cтрах и ненависть в MongoDB
Dmitry Viskov
 
Hadoop implementation in Wikimart
Roman Zykov
 
лабраб 7
Gulnaz Shakirova
 
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
Yandex
 
MongoDB@addconf
Sergei Tulentsev
 
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
Ad

More from Acceptic (6)

PDF
Incoming projects process flow
Acceptic
 
PDF
Secure data transfer (безопасная передача данных)
Acceptic
 
PDF
Why TDD doesn't work? (Кому что мешает, или почему TDD не работает?)
Acceptic
 
PDF
Tdd and BDD
Acceptic
 
PDF
Why Ruby?
Acceptic
 
PPT
Facebook Application Development Tips
Acceptic
 
Incoming projects process flow
Acceptic
 
Secure data transfer (безопасная передача данных)
Acceptic
 
Why TDD doesn't work? (Кому что мешает, или почему TDD не работает?)
Acceptic
 
Tdd and BDD
Acceptic
 
Why Ruby?
Acceptic
 
Facebook Application Development Tips
Acceptic
 
Ad

Mongo db aggregation

  • 2. ● Что такое Aggregation framework Аггрегирующие операторы Наборы аггрегирующих операторов Примеры использования Аналогии с SQL группирующими функциями (GROUP BY) ● ● ● ● Тезисы
  • 3. ● Группировка данных по определенным признакам (GROUP) Усреднение данных (AVG) Суммирование данных (SUM) Количество (COUNT) Не работает с: Binary, Symbol, MinKey, MaxKey, DBRef, Code, CodeWScope ● ● ● ● Aggregation
  • 5. Принцип работы Данные, обрабатываемые $pipeline1 Данные, обрабатываемые $pipeline2 Данные, обрабатываемые $pipeline3
  • 6. ● $project – позволяет задать поля для выборки, переименовать поля, операции над полем или полями Аналог в SQL - SELECT ● >db.collection.aggregate({ $project : { _id : 0, title : 1, vat : {$multiply : ["$price", 0.75] }, full_price : {"$price"} } }); //get title as is //custom field //rename field Операторы
  • 7. ● $match – задать условия для выборки. Используются аналогичные .find() операторы Аналог SQL - WHERE, HAVING ● ● >db.collection.aggregate([ {$match : { {price : {$gt : 100, $lt : 500}} }, {$project : { title : 1, //get title as is vat : {$multiply : ["$price", 0.75] }, //custom field vat full_price : {price : "$price", realprice : {$add : {"$price", "$personPrice"} } } } } ]); Операторы
  • 8. ● {$limit : i} – количество документов (SQL – LIMIT i) {$skip : n} - пропустить n документов (SQL – LIMIT n, i) {$unwind : “$field”} - создать документ для каждого элемента массива поля $field. Обычно используется с $group {$sort : {field : 1} } - cортировка данных ● ● ● Операторы
  • 9. ● $group - группирует данные по определенным полям. Результат хранит в памяти. Аналог SQL – GROUP BY ● ● >db.collection.aggregate([ {$group : { _id : cpu_family, sold : {$sum : 1}, profit : {$sum : "$price"} }, {$match : { {sold : {$gt : 1000}} }, //use previous processed fields {$project : { title : "$cpu_family", profit : "$profit" }}, {$sort : {profit : -1} }, {$limit : 10} ]); //get CPU family as title *Показать ТОП-10 семейств процессоров, набравших наибольшие суммы доходов и которых продано больше тысячи Операторы
  • 10. ● $addToSet - уникальный массив данных (GROUP_CONCAT(DISTINCT ...)) $first - первое значение, использовать только с $sort $last - последнее значение, использовать только с $sort $max - максимальное значение (SQL - MAX) $min - минимальное not null значение. До версии 2.4 возвращался null при наличии такового (SQL - MIN). $avg - усредненное значение $push – не уникальный массив данных (SQL - GROUP_CONCAT (...)) $sum - сумма значений или счетчик (SQL – SUM, COUNT) ● ● ● ● ● ● ● Group Functions
  • 11. MongoDB vs. SQL mongoDB MySQL$match WHERE $match HAVING $group GROUP BY $project SELECT $sort ORDER BY $limit LIMIT $sum SUM $sum COUNT
  • 12. >db.collection.aggregate([ { $group : { _id : cpu_family, sold : {$sum : 1}, profit : {$sum : "$price"}} // group by // count // sum }, {$match : {sold : {$gt : 1000} }}, //having count(`sold`) {$project : { title : "$cpu_family", profit : "$profit" }}, //`cpu_family` as `title` //leave as is {$sort : {profit : -1} }, {$limit : 10} ]); //order by //limit SELECT `cpu_family` as `title`, SUM(`price`) as `profit` FROM `table` GROUP BY `cpu_family` HAVING COUNT(`cpu_family`) > 1000 ORDER BY `profit` DESC LIMIT 10 MongoDB vs. SQL
  • 13. >db.collection.aggregate([ {$project : { title : 1, cpu_family : 1, manufacturer : 1 }}, {$group : { _id : cpu_family, alias : {$addToSet : "$title"}} ]); SELECT GROUP_CONCAT(DISTINCT `title`) as `alias` FROM `table` GROUP BY cpu_family MongoDB vs. SQL
  • 14. >db.collection.aggregate([ { $unwind: "$items" }, { $group: { _id: "$cust_id", qty: { $sum: "$items.qty" } } } ]); SELECT id, SUM(li.qty) as qty FROM orders o, order_lineitem li WHERE li.order_id = o.id GROUP BY cust_id MongoDB vs. SQL
  • 15. >db.collection.aggregate([ { $match: { status: 'A' } }, { $group: { _id: "$cust_id", total: { $sum: "$price" } } }, { $match: { total: { $gt: 250 } } } ]); SELECT cust_id, SUM(price) as total FROM orders WHERE status = 'A' GROUP BY cust_id HAVING total > 250 MongoDB vs. SQL