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)
2. ●
Что такое Aggregation framework
Аггрегирующие операторы Наборы
аггрегирующих операторов Примеры
использования
Аналогии с SQL группирующими
функциями (GROUP BY)
●
●
●
●
Тезисы
3. ● Группировка данных по определенным
признакам (GROUP)
Усреднение данных (AVG)
Суммирование данных (SUM)
Количество (COUNT)
Не работает с:
Binary, Symbol, MinKey, MaxKey, DBRef,
Code, CodeWScope
●
●
●
●
Aggregation
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