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
PRO

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.  
    Использование  в  боевых  проектах.  

    View Slide

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

    View Slide

  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  

    View Slide

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

    View Slide

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

    View Slide

  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.            }  }  });  

    View Slide

  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  }  
     

    View Slide

  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  }    ]  
     

    View Slide

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

    View Slide

  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")  }  
     
     

    View Slide

  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  }  ]  
     

    View Slide

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

    View Slide