Mongo Web Apps: OSCON 2011

30
http://mongodb.org http://10gen.com Building applications with MongoDB – An introduction Roger Bodamer [email protected] @rogerb

description

Building web applications with mongodb, an introduction

Transcript of Mongo Web Apps: OSCON 2011

Page 1: Mongo Web Apps: OSCON 2011

http://mongodb.orghttp://10gen.com

Building applications with MongoDB – An introduction

Roger [email protected]

@rogerb

Page 2: Mongo Web Apps: OSCON 2011

Today’s Talk• Developing your first Web Application with

MongoDB

• What is MongoDB, Platforms and availability• Data Modeling, queries and geospatial queries

• Location bases App• Example uses MongoDB Javascript shell

Page 3: Mongo Web Apps: OSCON 2011

Why MongoDB• Intrinsic support for agile development

• Super low latency access to your data–Very little CPU overhead

• No Additional caching layer required

• Built in Replication and Horizontal Scaling support

Page 4: Mongo Web Apps: OSCON 2011

MongoDB• Document Oriented Database

–Data is stored in documents, not tables / relations

• MongoDB is Implemented in C++ for best performance• Platforms 32/64 bit Windows Linux, Mac OS-X, FreeBSD,

Solaris

• Language drivers for:– Ruby / Ruby-on-Rails – Java– C#– JavaScript – C / C++ – Erlang Python, Perl others..... and much more ! ..

Page 5: Mongo Web Apps: OSCON 2011

Design• Want to build an app where users can check in

to a location

• Leave notes or comments about that location

• Iterative Approach:–Decide requirements–Design documents–Rinse, repeat :-)

Page 6: Mongo Web Apps: OSCON 2011

Requirements• Locations

–Need to store locations (Offices, Restaurants etc)•Want to be able to store name, address and tags

•Maybe User Generated Content, i.e. tips / small notes ?

–Want to be able to find other locations nearby

Page 7: Mongo Web Apps: OSCON 2011

Requirements• Locations

–Need to store locations (Offices, Restaurants etc)•Want to be able to store name, address and tags•Maybe User Generated Content, i.e. tips / small notes ?

–Want to be able to find other locations nearby

• Checkins–User should be able to ‘check in’ to a location–Want to be able to generate statistics

Page 8: Mongo Web Apps: OSCON 2011

TerminologyRDBMS MongoTable, View CollectionRow(s) JSON DocumentIndex IndexJoin Embedded

DocumentPartition ShardPartition Key Shard Key

Page 9: Mongo Web Apps: OSCON 2011

Collections

loc1, loc2, loc3

Locations

Users

User1, User2

Page 10: Mongo Web Apps: OSCON 2011

JSON Sample Doc { _id : ObjectId("4c4ba5c0672c685e5e8aabf3"), author : "roger", date : "Sat Jul 24 2010 19:47:11 GMT-0700 (PDT)", text : ”MongoSF", tags : [ ”San Francisco", ”MongoDB" ] } Notes: - _id is unique, but can be anything you’d like

Page 11: Mongo Web Apps: OSCON 2011

BSON

• JSON has powerful, but limited set of datatypes–Mongo extends datypes with Date, Int types, Id, …

• MongoDB stores data in BSON

• BSON is a binary representation of JSON–Optimized for performance and navigational abilities

–Also compression–See bsonspec.org

Page 12: Mongo Web Apps: OSCON 2011

location1= {name: "10gen East Coast”,address: ”134 5th Avenue 3rd Floor”,city: "New York”,zip: "10011”

}

Locations v1

Page 13: Mongo Web Apps: OSCON 2011

location1= {name: "10gen East Coast”,address: ”134 5th Avenue 3rd Floor”,city: "New York”,zip: "10011”

}

db.locations.find({zip:”10011”}).limit(10)

Places v1

Page 14: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen East Coast”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,

tags: [“business”, “mongodb”]

}

Places v2

Page 15: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen East Coast”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,

tags: [“business”, “mongodb”]

}

db.locations.find({zip:”10011”, tags:”business”})

Places v2

Page 16: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen East Coast”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,

tags: [“business”, “mongodb”],

latlong: [40.0,72.0]

}

Places v3

Page 17: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen East Coast”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,

tags: [“business”, “cool place”],

latlong: [40.0,72.0]

}

db.locations.ensureIndex({latlong:”2d”})

Places v3

Page 18: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen HQ”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,

tags: [“business”, “cool place”],

latlong: [40.0,72.0]

}

db.locations.ensureIndex({latlong:”2d”})db.locations.find({latlong:{$near:[40,70]}})

Places v3

Page 19: Mongo Web Apps: OSCON 2011

location1 = {name: "10gen HQ”,address: "17 West 18th Street 8th Floor”,city: "New York”,zip: "10011”,latlong: [40.0,72.0],

tags: [“business”, “cool place”],

tips: [{user:"nosh", time:6/26/2010, tip:"stop by for office

hours on Wednesdays from 4-6pm"}, {.....},

]

}

Places v4

Page 20: Mongo Web Apps: OSCON 2011

Creating your indexesdb.locations.ensureIndex({tags:1})db.locations.ensureIndex({name:1})db.locations.ensureIndex({latlong:”2d”})

Finding places:db.locations.find({latlong:{$near:[40,70]}})

With regular expressions:db.locations.find({name: /^typeaheadstring/)

By tag:db.locations.find({tags: “business”})

Querying your Places

Page 21: Mongo Web Apps: OSCON 2011

Initial data load:db.locations.insert(place1)

Using update to Add tips:db.locations.update({name:"10gen HQ"},

{$push :{tips: {user:"nosh", time:6/26/2010,

tip:"stop by for office hours on Wednesdays from 4-6"}}}}

Inserting and updating locations

Page 22: Mongo Web Apps: OSCON 2011

Requirements• Locations

–Need to store locations (Offices, Restaurants etc)•Want to be able to store name, address and tags•Maybe User Generated Content, i.e. tips / small notes ?

–Want to be able to find other locations nearby

• Checkins–User should be able to ‘check in’ to a location–Want to be able to generate statistics

Page 23: Mongo Web Apps: OSCON 2011

user1 = {name: “nosh”email: “[email protected]”,...

checkins: [{ location: “10gen HQ”, ts: 9/20/2010 10:12:00, …}, … ]}

Users

Page 24: Mongo Web Apps: OSCON 2011

Simple Statsdb.users.find({‘checkins.location’: “10gen HQ”)

db.checkins.find({‘checkins.location’: “10gen HQ”}).sort({ts:-1}).limit(10)

db.checkins.find({‘checkins.location’: “10gen HQ”, ts: {$gt: midnight}}).count()

Page 25: Mongo Web Apps: OSCON 2011

user1 = {name: “nosh”email: “[email protected]”,...checkins: [4b97e62bf1d8c7152c9ccb74,

5a20e62bf1d8c736ab]}

checkins [] = ObjectId reference to locations collection

Alternative

Page 26: Mongo Web Apps: OSCON 2011

Check-in = 2 opsread location to obtain location idUpdate ($push) location id to user object

Queries: find all locations where a user checked in: checkin_array = db.users.find({..}, {checkins:true}).checkins

db.location.find({_id:{$in: checkin_array}})

User Check in

Page 27: Mongo Web Apps: OSCON 2011

Unsharded Deployment

Secondary

Primary•Configure as a replica set for automated failover•Async replication between nodes

•Add more secondaries to scale reads

Secondary

Page 28: Mongo Web Apps: OSCON 2011

Sharded Deployment

Secondary

Primary

MongoSMongoS

•Autosharding distributes data among two or more replica sets• Mongo Config Server(s) handles distribution & balancing

• Transparent to applications

config

config

Page 29: Mongo Web Apps: OSCON 2011

Use Cases•RDBMS replacement for high-traffic web

applications

•Content Management-type applications

•Real-time analytics

•High-speed data logging

Web 2.0, Media, SaaS, Gaming, Finance, Telecom, Healthcare

Page 30: Mongo Web Apps: OSCON 2011

http://mongodb.orghttp://10gen.com

10Gen is hiring! @mongodb

[email protected]@rogerb