Share
Embed
Mongo Aggregation Framework и pymongo
Aggregation Framework: небольшое сравнение с Map/Reduce как ближайшего соседа по смыслу. Ну и на закуску описание pipeline операторов с примерами из жизни на pymongo.
Moscow Python Meetup PRO
September 20, 2012
Transcript
12 slides
-
Mongo Aggregation Framework Что такое MongoDB? NoSQL vs SQL.
Но Map/Reduce уже был давно? Плюсы и минусы AggregaNon Framework. Использование в боевых проектах. -
MongoDB ¤ Скорость (хранится в ОЗУ) ¤ Простота (JSON)
¤ Гибкость (JS, GridFS, atomic & aggregaNon) ¤ Масштабируемость (sharding) -
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 -
AggregaNon Framework ¤ “Map/Reduce is a big hammer” Chris
WesNn, 10gen ¤ Быстрый декларативный фреймворк ¤ Работает на угле с помощью pipelines ¤ Не использует медленный JavaScript -
Pipeline Группа операторов, которые описывают поток данных
в процессе агрегации. Input → $match → $project → $group → $project → $sort → Output $project (SELECT) $unwind $match (WHERE) $group (GROUP BY) $limit (LIMIT) $sort (ORDER BY) $skip (OFFSET) -
$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. } } }); -
$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 } -
$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 } ] -
Other pipelines ¤ $skip, $limit, $sort ¤ $match:
db.collecNon.aggregate({ $match : { a : { $gte : 1, $lt : 3 } } }) 7 операторов обеспечивают 95% потребности -
Пример { "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") } -
Пример 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 } ] -
Спасибо за внимание У нас
всегда есть печеньки и вкусный кофе Приходите в гости! Ковригин Вадим h¨p://keepthecopy.com/-‐7yrTA