Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Aggregation frameworkИгорь Визьма@ivizma
●Что такое Aggregation frameworkАггрегирующие операторы Наборыаггрегирующих операторов ПримерыиспользованияАналогии с SQL ...
● Группировка данных по определеннымпризнакам (GROUP)Усреднение данных (AVG)Суммирование данных (SUM)Количество (COUNT)Не ...
>db.collection.aggregate([{$pipeline_1},{$pipeline_2},{$pipeline_3},{$pipeline_n}]);>db.collection.aggregate({$pipeline_1}...
Принцип работыДанные, обрабатываемые$pipeline1Данные, обрабатываемые $pipeline2Данные, обрабатываемые $pipeline3
●$project – позволяет задать поля для выборки,переименовать поля, операции над полем или полямиАналог в SQL - SELECT●>db.c...
●$match – задать условия для выборки.Используются аналогичные .find() операторыАналог SQL - WHERE, HAVING●●>db.collection....
● {$limit : i} – количество документов (SQL – LIMIT i){$skip : n} - пропустить n документов (SQL – LIMIT n, i){$unwind : “...
●$group - группирует данные по определенным полям.Результат хранит в памяти.Аналог SQL – GROUP BY●●>db.collection.aggregat...
● $addToSet - уникальный массив данных(GROUP_CONCAT(DISTINCT ...))$first - первое значение, использовать только с $sort$la...
MongoDB vs. SQLmongoDB MySQL$match WHERE$match HAVING$group GROUP BY$project SELECT$sort ORDER BY$limit LIMIT$sum SUM$sum ...
>db.collection.aggregate([{ $group : { _id : cpu_family,sold : {$sum : 1},profit : {$sum : "$price"}}// group by// count//...
>db.collection.aggregate([{$project : { title : 1, cpu_family : 1, manufacturer : 1 }},{$group : { _id : cpu_family,alias ...
>db.collection.aggregate([{ $unwind: "$items" },{ $group: { _id: "$cust_id",qty: { $sum: "$items.qty" } } }]);SELECT id, S...
>db.collection.aggregate([{ $match: { status: A } },{ $group: { _id: "$cust_id",total: { $sum: "$price" } } },{ $match: { ...
ВопросыIgor Vizma@ivizma
Upcoming SlideShare
Loading in …5
×

Mongo db aggregation

1,683 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
  • Be the first to comment

  • Be the first to like this

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

×