Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
MongoDB for Analytics
John Nunemaker
PRO
October 18, 2011
Programming
16
28k
MongoDB for Analytics
Presented at Mongo Chicago 2011.
John Nunemaker
PRO
October 18, 2011
Tweet
Share
More Decks by John Nunemaker
See All by John Nunemaker
Atom
jnunemaker
PRO
7
2.8k
MongoDB for Analytics
jnunemaker
PRO
8
530
Addicted to Stable
jnunemaker
PRO
32
2k
MongoDB for Analytics
jnunemaker
PRO
21
2.1k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
Why NoSQL?
jnunemaker
PRO
10
700
Don't Repeat Yourself, Repeat Others
jnunemaker
PRO
7
2.9k
I Have No Talent
jnunemaker
PRO
14
680
Why MongoDB Is Awesome
jnunemaker
PRO
18
4.1k
Other Decks in Programming
See All in Programming
Enumを自動で網羅的にテストしてみた
estie
0
1.3k
フロントエンドで 良いコードを書くために
t_keshi
3
1.6k
OSSから学んだPR Descriptionの書き方
fugakkbn
4
130
23年のJavaトレンドは?Quarkusで理解するコンテナネイティブJava
tatsuya1bm
1
120
How to Fight Production Incidents?
asatarin
0
200
Micro Frontends with Module Federation @MicroFrontend Summit 2023
manfredsteyer
PRO
0
570
社会人 20 年目エンジニア、発信で技術学びなおしてる話
e99h2121
1
140
Rによる大規模データの処理
s_uryu
2
640
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
300
Swift Concurrency in GoodNotes
inamiy
4
1.3k
監視せなあかんし、五大紙だけにオオカミってな🐺🐺🐺🐺🐺
sadnessojisan
2
1.5k
10年以上続くプロダクトの フロントエンド刷新プロジェクトのふりかえり
yotahada3
2
340
Featured
See All Featured
Design by the Numbers
sachag
271
18k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
29
7.9k
Become a Pro
speakerdeck
PRO
6
3.2k
How New CSS Is Changing Everything About Graphic Design on the Web
jensimmons
214
12k
Building Your Own Lightsaber
phodgson
96
4.9k
Bash Introduction
62gerente
601
210k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Testing 201, or: Great Expectations
jmmastey
25
5.7k
A Philosophy of Restraint
colly
193
15k
How To Stay Up To Date on Web Technology
chriscoyier
779
250k
Ruby is Unlike a Banana
tanoku
93
9.5k
Transcript
Ordered List John Nunemaker MongoChi 2011 October 18, 2011 MongoDB
for Analytics A loving conversation with @jnunemaker
Background As presented through interpretive dance
None
None
None
~1 month Of evenings and weekends
~4 dog years Since public launch
~6 tiny servers 2 web, 2 app, 2 db
~1-2 Million Page views per day
None
None
Implementation Imma show you how we do what we do
baby
Doing It Live No aggregate querying
get('/track.gif') do Hit.record(...) TrackGif end
class Hit def record site.atomic_update(site_updates) Resolution.record(self) Technology.record(self) Location.record(self) Referrer.record(self) Content.record(self)
Search.record(self) Notification.record(self) View.record(self) end end
class Resolution def record(hit) query = {'_id' => "..."} update
= {'$inc' => {}} update['$inc']["sx.#{hit.screenx}"] = 1 update['$inc']["bx.#{hit.browserx}"] = 1 update['$inc']["by.#{hit.browsery}"] = 1 collection(hit.created_on) .update(query, update, :upsert => true) end end end
Pros
Pros Space
Pros Space RAM
Pros Space RAM Reads
Pros Space RAM Reads Live
Cons
Cons Writes
Cons Writes Constraints
Cons Writes Constraints More Forethought
Cons Writes Constraints More Forethought No raw data
Time Frame Minute, hour, month, day, year, forever?
# of Variations One document vs many
Single Document Per Time Frame
None
{ "t" => 336381, "u" => 158951, "2011" => {
"02" => { "18" => { "t" => 9, "u" => 6 } } } }
{ '$inc' => { 't' => 1, 'u' => 1,
'2011.02.18.t' => 1, '2011.02.18.u' => 1, } }
Single Document For all ranges in time frame
None
{ "_id" =>"...:10", "bx" => { "320" => 85, "480"
=> 318, "800" => 1938, "1024" => 5033, "1280" => 6288, "1440" => 2323, "1600" => 3817, "2000" => 137 }, "by" => { "480" => 2205, "600" => 7359,
"600" => 7359, "768" => 4515, "900" => 3833, "1024"
=> 2026 }, "sx" => { "320" => 191, "480" => 179, "800" => 195, "1024" => 1059, "1280" => 5861, "1440" => 3533, "1600" => 7675, "2000" => 1279 } }
{ '$inc' => { 'sx.1440' => 1, 'bx.1280' => 1,
'by.768' => 1, } }
Many Documents Search terms, content, referrers...
None
[ { "_id" => "<oid>:<hash>", "t" => "ruby class variables",
"sid" => BSON::ObjectId('<oid>'), "v" => 352 }, { "_id" => "<oid>:<hash>", "t" => "ruby unless", "sid" => BSON::ObjectId('<oid>'), "v" => 347 }, ]
Writes {'_id' => "#{site_id}:#{hash}"}
Reads [['sid', 1], ['v', -1]]
Growth The best laid plans of mice and men
Partition Hot Data Currently using collections for time frames
Bigger, Faster Server More CPU, RAM, Disk Space
Users Sites Content Referrers Terms Engines Resolutions Locations Users Sites
Content Referrers Terms Engines Resolutions Locations
Partition by Function Spread writes across a few servers
Users Sites Content Referrers Terms Engines Resolutions Locations
Partition by Server Spread writes across a ton of servers,
way down the road, not worried yet
Ordered List Thank you!
[email protected]
John Nunemaker MongoChi 2011 October
18, 2011 @jnunemaker