Upload
dmitriy
View
1.012
Download
0
Embed Size (px)
DESCRIPTION
Prerared by: Igor Wizma, mongoDB Certified Engineer. Summary: What is Aggregation Framework? Aggregation operators Sets of aggregation operators Samples Analogy with SQL-grouping functions (GROUP BY)
Citation preview
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 isvat : {$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. SQLmongoDB 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`) > 1000ORDER 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 totalFROM orders WHERE status = 'A' GROUP BY cust_id HAVING total > 250
MongoDB vs. SQL
Вопросы
Igor Vizma@ivizma