16
Aggregation framework Игорь Визьма @ivizma

Mongo db aggregation

  • Upload
    dmitriy

  • View
    996

  • 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

Page 1: Mongo db aggregation

Aggregation framework

Игорь Визьма@ivizma

Page 2: Mongo db aggregation

● Что такое Aggregation framework Аггрегирующие операторы Наборы аггрегирующих операторов Примеры использования

Аналогии с SQL группирующими функциями (GROUP BY)

Тезисы

Page 3: Mongo db aggregation

● Группировка данных по определенным признакам (GROUP)Усреднение данных (AVG)

Суммирование данных (SUM)

Количество (COUNT)

Не работает с:

Binary, Symbol, MinKey, MaxKey, DBRef, Code, CodeWScope

Aggregation

Page 4: Mongo db aggregation

>db.collection.aggregate([

{$pipeline_1},

{$pipeline_2},

{$pipeline_3},

{$pipeline_n}

]);

>db.collection.aggregate({$pipeline_1});

Форма записи

Page 5: Mongo db aggregation

Принцип работыДанные, обрабатываемые $pipeline1

Данные, обрабатываемые $pipeline2

Данные, обрабатываемые $pipeline3

Page 6: Mongo db aggregation

● $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

Операторы

Page 7: Mongo db aggregation

●$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"} } }

}

}]);

Операторы

Page 8: Mongo db aggregation

● {$limit : i} – количество документов (SQL – LIMIT i)

{$skip : n} - пропустить n документов (SQL – LIMIT n, i)

{$unwind : “$field”} - создать документ для каждого элемента массива поля $field. Обычно используется с$group

{$sort : {field : 1} } - cортировка данных

Операторы

Page 9: Mongo db aggregation

●$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 семейств процессоров, набравших наибольшие суммы доходов и которых продано больше тысячи

Операторы

Page 10: Mongo db aggregation

● $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

Page 11: Mongo db aggregation

MongoDB vs. SQLmongoDB MySQL$match WHERE

$match HAVING

$group GROUP BY

$project SELECT

$sort ORDER BY

$limit LIMIT

$sum SUM

$sum COUNT

Page 12: Mongo db aggregation

>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

Page 13: Mongo db aggregation

>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

Page 14: Mongo db aggregation

>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

Page 15: Mongo db aggregation

>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

Page 16: Mongo db aggregation

Вопросы

Igor Vizma@ivizma