Slide 1

Slide 1 text

Mongo Aggregation Framework Что  такое  MongoDB?  NoSQL  vs  SQL.   Но  Map/Reduce  уже  был  давно?   Плюсы  и  минусы  AggregaNon  Framework.   Использование  в  боевых  проектах.  

Slide 2

Slide 2 text

MongoDB   ¤ Скорость  (хранится  в  ОЗУ)   ¤ Простота  (JSON)   ¤ Гибкость  (JS,  GridFS,  atomic  &  aggregaNon)   ¤ Масштабируемость  (sharding)  

Slide 3

Slide 3 text

MongoDB   SQL   NoSQL  (MongoDB)   SELECT  *  FROM  table;   db.collecNon.find()   {  "k1"  :  int,  "k2"  :  text  }   {  "k1"  :  int,  "k2"  :  bin,  "k3"  :  date  }     INSERT  INTO  USERS  VALUES(3,  5)   db.users.insert({  a  :  3,  b  :  5  })   SELECT  *  FROM  users  WHERE  age  =  33     ORDER  BY  name   db.users.find({  age  :  33  }).sort({  name  :  1  })   UPDATE  users  SET  a  =  a  +  2  WHERE  b  =  'q'   db.users.update({  b  :  "q"  },  {  $inc  :  {  a  :  2  }  })   id   col1   col2   1   name1   text1   2   name2   text2  

Slide 4

Slide 4 text

AggregaNon  Framework   ¤  “Map/Reduce  is  a  big  hammer”  Chris  WesNn,  10gen   ¤  Быстрый  декларативный  фреймворк   ¤  Работает  на  угле  с  помощью  pipelines   ¤  Не  использует  медленный  JavaScript  

Slide 5

Slide 5 text

Pipeline     Группа  операторов,  которые  описывают   поток  данных  в  процессе  агрегации.   Input  →  $match  →  $project  →  $group  →  $project  →  $sort  →  Output     $project  (SELECT)   $unwind   $match  (WHERE)   $group  (GROUP  BY)   $limit  (LIMIT)   $sort  (ORDER  BY)   $skip  (OFFSET)  

Slide 6

Slide 6 text

$project   ¤  Описание  данных   ¤  Позволяет  добавлять,  переименовывать  и  удалять  поля   1.      db.arNcle.aggregate({$project  :  {     2.            _id  :  0,   3.            username:  1,   4.            info:  {   5.                    views:  “$views”,   6.                    profileViewsAdd:  {  $add:  [  “$views”,  3  ]  },   7.                    userHosts:  {  “$staNc.hosts”  }   8.            }  }  });  

Slide 7

Slide 7 text

$group   ¤  Обязателен  параметр  _id   ¤  Операторы:   ¤  $sum,  $avg,  $min,  $max,  $first,  $last   ¤  $push,  $addToSet  –  объединение  в  списки   1.      {  "a"  :  int(),  "b"  :  int()  }   2.      >      db.posts.aggregate({  $group  :  {  _id:  "$a"  ,  "b_sum"  :  {  $sum:  "$b"  }  }  })   3.      {"result"  :  [   4.              {  "_id"  :  1,  "b_sum"  :  8  },   5.              {  "_id"  :  2,  "b_sum"  :  11  },   6.      ],  "ok"  :  1  }    

Slide 8

Slide 8 text

$unwind   ¤  $unwind  –  выполняет  нормализацию  данных              (обратный  эффект  $group)      1.      {  "a"  :  1,  "b"  :  [  2,  3  ]  }      2.      {  "a"  :  1,  "b"  :  [  2,  4  ]  }      3.      {  "a"  :  2,  "b"  :  [  3,  7  ]  }      4.      >  db.test.aggregate({  $project  :  {  _id  :  "$a",  b  :  1}  },  {  $unwind  :  "$b"  })      5.      [    {  "_id"  :  1,  "b"  :  2  },      6.            {  "_id"  :  1,  "b"  :  3  },      7.            {  "_id"  :  1,  "b"  :  2  },      8.            {  "_id"  :  1,  "b"  :  4  },      9.            {  "_id"  :  2,  "b"  :  3  },   10.            {  "_id"  :  2,  "b"  :  7  }    ]    

Slide 9

Slide 9 text

Other  pipelines   ¤  $skip,  $limit,  $sort   ¤  $match:   db.collecNon.aggregate({  $match  :  {  a  :  {  $gte  :  1,  $lt  :  3  }  }  })       7  операторов  обеспечивают  95%  потребности  

Slide 10

Slide 10 text

Пример   {  "name"  :  "HEARTBEAT",  "uploadDate"  :  ISODate("2012-­‐09-­‐06T12:26:33.432Z")  }   {  "name"  :  "LOGIN",  "uploadDate"  :  ISODate("2012-­‐09-­‐06T12:23:47.103Z")  }   {  "name"  :  "LOGIN",  "uploadDate"  :  ISODate("2012-­‐09-­‐06T12:25:59.894Z")  }   {  "name"  :  "RESTORE",  "uploadDate"  :  ISODate("2012-­‐09-­‐06T16:28:18.143Z")  }      

Slide 11

Slide 11 text

Пример      1.      db.messages.aggregate([      2.              {  "$project"  :  {      3.                      "_id"  :  0,      4.                      "name"  :  1,      5.                      "segm"  :  {      6.                              "$subtract"  :  [      7.                                      ts_len,      8.                                      {  "$add"  :  {      9.                                              "$cond"  :  [  {  "$gte"  :  [  "$uploadDate",  ts1  ]},  1,  0  ]   10.                                              "$cond"  :  [  {  "$gte"  :  [  "$uploadDate",  ts2  ]},  1,  0  ]   11.                                              "$cond"  :  [  {  "$gte"  :  [  "$uploadDate",  ts3  ]},  1,  0  ]}}]}}},   12.              {  "$group"  :  {   13.                      "_id"  :  {  "mesName"  :  "$name",  "mesSegm"  :  "$segm"  },     14.                      "mesCount"  :  {  "$sum"  :  1  }}}])     15.      [  {  "_id"  :  {  "mesName"  :  "LOGIN",  "mesSegm"  :  0  },  "mesCount"  :  18  }  ]    

Slide 12

Slide 12 text

Спасибо  за  внимание           У  нас  всегда  есть  печеньки  и  вкусный  кофе   Приходите  в  гости!         Ковригин  Вадим   h¨p://keepthecopy.com/-­‐7yrTA