SlideShare a Scribd company logo
1 of 16
Download to read offline
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

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

What's hot (20)

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

Similar to Mongo db aggregation

Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Ivan Muratov
 
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...
Встреча №9. Алгоритмы и коллекции стандартных библиотек C++, C#, Java, Object...CocoaHeads
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
MongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaMongoDB - About Performance Optimization, Ivan Griga - Smart Gamma
MongoDB - About Performance Optimization, Ivan Griga - Smart GammaEvgeniy Kuzmin
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капляmeet_magento
 
Hacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаHacking PostgreSQL. Обзор исходного кода
Hacking PostgreSQL. Обзор исходного кодаAnastasia Lubennikova
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1Nikolay Samokhvalov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
Быть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyБыть в 10 раз эффективнее благодаря Groovy
Быть в 10 раз эффективнее благодаря GroovyEvgeny Kompaniyets
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Ontico
 
Базы данных лекция №8
Базы данных лекция №8Базы данных лекция №8
Базы данных лекция №8Vitaliy Pak
 
Cтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBCтрах и ненависть в MongoDB
Cтрах и ненависть в MongoDBDmitry Viskov
 
Hadoop implementation in Wikimart
Hadoop implementation in WikimartHadoop implementation in Wikimart
Hadoop implementation in WikimartRoman Zykov
 
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...
Владимир Алаев, Сергей Белов "Новые возможности bem-tools для автоматической ...Yandex
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoMagecom Ukraine
 

Similar to Mongo db aggregation (20)

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

More from Acceptic

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

More from Acceptic (6)

Incoming projects process flow
Incoming projects process flowIncoming projects process flow
Incoming projects process flow
 
Secure data transfer (безопасная передача данных)
Secure data transfer (безопасная передача данных)Secure data transfer (безопасная передача данных)
Secure data transfer (безопасная передача данных)
 
Why TDD doesn't work? (Кому что мешает, или почему TDD не работает?)
 Why TDD doesn't work? (Кому что мешает,   или почему  TDD  не работает?) Why TDD doesn't work? (Кому что мешает,   или почему  TDD  не работает?)
Why TDD doesn't work? (Кому что мешает, или почему TDD не работает?)
 
Tdd and BDD
Tdd and BDDTdd and BDD
Tdd and BDD
 
Why Ruby?
Why Ruby?Why Ruby?
Why Ruby?
 
Facebook Application Development Tips
Facebook Application Development TipsFacebook Application Development Tips
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