Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mongo Aggregation Framework и pymongo

Mongo Aggregation Framework и pymongo

Aggregation Framework: небольшое сравнение с Map/Reduce как ближайшего соседа по смыслу. Ну и на закуску описание pipeline операторов с примерами из жизни на pymongo.

Moscow Python Meetup

September 20, 2012
Tweet

More Decks by Moscow Python Meetup

Other Decks in Technology

Transcript

  1. Mongo Aggregation Framework Что  такое  MongoDB?  NoSQL  vs  SQL.  

    Но  Map/Reduce  уже  был  давно?   Плюсы  и  минусы  AggregaNon  Framework.   Использование  в  боевых  проектах.  
  2. MongoDB   ¤ Скорость  (хранится  в  ОЗУ)   ¤ Простота  (JSON)  

    ¤ Гибкость  (JS,  GridFS,  atomic  &  aggregaNon)   ¤ Масштабируемость  (sharding)  
  3. 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  
  4. AggregaNon  Framework   ¤  “Map/Reduce  is  a  big  hammer”  Chris

     WesNn,  10gen   ¤  Быстрый  декларативный  фреймворк   ¤  Работает  на  угле  с  помощью  pipelines   ¤  Не  использует  медленный  JavaScript  
  5. Pipeline     Группа  операторов,  которые  описывают   поток  данных

     в  процессе  агрегации.   Input  →  $match  →  $project  →  $group  →  $project  →  $sort  →  Output     $project  (SELECT)   $unwind   $match  (WHERE)   $group  (GROUP  BY)   $limit  (LIMIT)   $sort  (ORDER  BY)   $skip  (OFFSET)  
  6. $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.            }  }  });  
  7. $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  }    
  8. $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  }    ]    
  9. Other  pipelines   ¤  $skip,  $limit,  $sort   ¤  $match:

      db.collecNon.aggregate({  $match  :  {  a  :  {  $gte  :  1,  $lt  :  3  }  }  })       7  операторов  обеспечивают  95%  потребности  
  10. Пример   {  "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")  }      
  11. Пример      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  }  ]    
  12. Спасибо  за  внимание           У  нас

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