Mongo db aggregation

1,378 views
1,202 views

Published on

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)

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,378
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
15
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mongo db aggregation

  1. 1. Aggregation frameworkИгорь Визьма@ivizma
  2. 2. ●Что такое Aggregation frameworkАггрегирующие операторы Наборыаггрегирующих операторов ПримерыиспользованияАналогии с SQL группирующимифункциями (GROUP BY)●●●●Тезисы
  3. 3. ● Группировка данных по определеннымпризнакам (GROUP)Усреднение данных (AVG)Суммирование данных (SUM)Количество (COUNT)Не работает с:Binary, Symbol, MinKey, MaxKey, DBRef,Code, CodeWScope●●●●Aggregation
  4. 4. >db.collection.aggregate([{$pipeline_1},{$pipeline_2},{$pipeline_3},{$pipeline_n}]);>db.collection.aggregate({$pipeline_1});Форма записи
  5. 5. Принцип работыДанные, обрабатываемые$pipeline1Данные, обрабатываемые $pipeline2Данные, обрабатываемые $pipeline3
  6. 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. 7. ●$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"} } }}}]);Операторы
  8. 8. ● {$limit : i} – количество документов (SQL – LIMIT i){$skip : n} - пропустить n документов (SQL – LIMIT n, i){$unwind : “$field”} - создать документ для каждогоэлемента массива поля $field. Обычно используется с$group{$sort : {field : 1} } - cортировка данных●●●Операторы
  9. 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. 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. 11. MongoDB vs. SQLmongoDB MySQL$match WHERE$match HAVING$group GROUP BY$project SELECT$sort ORDER BY$limit LIMIT$sum SUM$sum COUNT
  12. 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//limitSELECT `cpu_family` as `title`, SUM(`price`) as `profit`FROM `table`GROUP BY `cpu_family`HAVING COUNT(`cpu_family`) > 1000ORDER BY `profit` DESC LIMIT 10MongoDB vs. SQL
  13. 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_familyMongoDB vs. SQL
  14. 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 GROUPBY cust_idMongoDB vs. SQL
  15. 15. >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 BYcust_id HAVING total > 250MongoDB vs. SQL
  16. 16. ВопросыIgor Vizma@ivizma

×