#MongoDB Simple Real-Time Stats Demo ###Also starring node.js and D3
MongoDB Thames Valley User Group (April 2012)
MongoDB London User Group (May 2012)
##Contents
- Slides [PDF]
- Scripts for all demo steps
- Two node servers to stream MongoDB data
- A node web server for pages with D3 charting
##Prerequisites
- MongoDB (2.0.2 used)
- Node.JS (0.6.10 used)
##Installation
-
Put these files demo somewhere (e.g. /usr/local/rtsdemo)
-
Edit scripts/rtsdemo.conf and set location of MongoDB and the home directory for this demo
MONGODB_HOME // root directory of MongoDB install RTSDEMO_HOME // root directory for these files
The demo includes a number of shortcut scripts for starting and stopping MongoDB etc. They keep MongoDB demo data local to the demo directory ($RTSDEMO_HOME/temp) so as not to interfere with any existing local installation. All commands below will assume a root of $RTSDEMO_HOME
##Part One
Run a single server mongod, make a capped collection, put docs into it and stream it to a couple of simple browser visualisations
-
Start mongod as single server
scripts/ss.start.sh
Other useful scripts
scripts/ss.stop.sh // shuts single server down scripts/ss.clean.sh // removes temp data/log/pid files
-
Start mongo shell and create a capped collection
scripts/ss.shell.sh
then in mongo shell
use rtsdemo db.createCollection("statstore", {capped: true, size: 5000000});
-
Write data to mongoDB, either manually or by running writer script
db.statstore.save({ event: 'login', count: 5});
-
Query with a tailable cursor
c = db.collection.find({}).addOption(2).addOption(32);
-
This queries, waits about 4 secs, and times out
-
Next step is to put cursor query into a loop ..
for(i=0;i<8;i++) { while(c.hasNext()) { var doc = c.next(); printjson( doc ); } }
A loop like this is not a great idea for anything other than a demo so next step is to move reader functionality to something like node.js (ruby or python would be just as good)
-
Start node.js server for demo web pages
node server
-
Start node.js listener
node sswatcher
-
Open browser (only tested in chrome 18.0, FF should work fine).
The http server by default runs on http://localhost:8010 the websocket on ws://localhost:8011Tabs in browser are:
Simple Receiver - watches collection "statstore" in database "rtsdemo" and displays the document ID of each doc that gets appended to the capped collection
D3 Example - short showcase of D3 using one JSON set, visualised in various ways
Bar Chart - watches same db/collection as Simple Receiver but displays event details in bar chart
Op Log Watcher - used in part 2 of demo -
To activate Simple Receiver and Bar Chart either use a simple mongo shell writer script to fill the collection with random stuff …
This, for example, creates 200k docs, to loop at least once around the capped collection
var events = [ 'login', 'logout', 'home-page', 'basket-add', 'basket-view', 'prod-page', 'feedback', 'ad-click' ] function random(max) { return Math.floor(Math.random() * max) + 1; } for(i=0; i<200000; i++) { db.statstore.save({event: events[random(events.length)-1], count: random(5) }) }
Note - this can be run directly from script/ss.data.sh
Open http://localhost:8010/PieChart.html http://localhost:8010/nvd3Bar.html http://localhost:8010/multibar.html http://localhost:8010/BubbleChart.html