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

PDF
19 - Базы данных. Агрегирование и группировка
PDF
12 - Web-технологии. Django модели
PDF
Web Internship - PHP and MySQL
PPTX
I tmozg js_school
PDF
GAE - плюсы/минусы/подводные камни
PPTX
Caching on highload Drupal site - Alexander Shumenko
PDF
Перевод базы Caché из 8 бит в Unicode
PPTX
PHP and MySQL
19 - Базы данных. Агрегирование и группировка
12 - Web-технологии. Django модели
Web Internship - PHP and MySQL
I tmozg js_school
GAE - плюсы/минусы/подводные камни
Caching on highload Drupal site - Alexander Shumenko
Перевод базы Caché из 8 бит в Unicode
PHP and MySQL

What's hot (20)

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

Similar to Mongo db aggregation (20)

PDF
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
PDF
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
PDF
Web осень 2013 лекция 6
PDF
Apache spark
PPTX
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
PDF
Magento - Антон Капля
PDF
Hacking PostgreSQL. Обзор исходного кода
PPTX
#PostgreSQLRussia в банке Тинькофф, доклад №1
PDF
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
PPTX
Быть в 10 раз эффективнее благодаря Groovy
PDF
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PDF
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
PPT
Базы данных лекция №8
PPTX
Расширение библиотеки Slick
PPTX
Cтрах и ненависть в MongoDB
PPT
Hadoop implementation in Wikimart
PPT
лабраб 7
PDF
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
PDF
MongoDB@addconf
PPTX
Реализация шаблонов корпоративных приложений в Magento
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Web осень 2013 лекция 6
Apache spark
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
Magento - Антон Капля
Hacking PostgreSQL. Обзор исходного кода
#PostgreSQLRussia в банке Тинькофф, доклад №1
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Быть в 10 раз эффективнее благодаря Groovy
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Базы данных лекция №8
Расширение библиотеки Slick
Cтрах и ненависть в MongoDB
Hadoop implementation in Wikimart
лабраб 7
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
MongoDB@addconf
Реализация шаблонов корпоративных приложений в Magento
Ad

More from Acceptic (6)

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

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