Upload
mongodb
View
3.100
Download
2
Tags:
Embed Size (px)
DESCRIPTION
Storing data about users is central to most applications. Whether you run a social network, an identity management system, or an online game, your users are the core of your business. In this webinar, we will discuss MongoDB’s capability to accommodate your evolving user data model and sustain the transaction load associated with accessing and updating user data.
Citation preview
User Data Managementwith
Please stand by...We’ll begin shortly.
Audio: 1-877-668-4493Access code: 666 500 606
Q&A to follow the webinar
Recording Available 24 Hours After EventOther issues? E-mail [email protected]
Kevin HansonSolutions Architect, [email protected]: @hungarianhc
Agenda// High Level Overview> MongoDB> User Data
// Modeling & Querying User Data> Insurance Company User Data> User Check-Ins
// Extending the Data Model for Future Use-Cases> Tracking User Activity> Social Media
MongoDB• Scalable, High-Performance, Open Source, Document-
Oriented Database– JSON (well... BSON) Storage Model– Indexes and Full Query Language– Easy for Developers to Pick Up– Easy for Administrators to Scale
• More Features at http://www.mongodb.org/
• Overview Video: http://www.10gen.com/what-is-mongodb
User Data• Account Information
– Name, Address, etc– Account Status– Notes
• Activity Streams– Posts, Tweets, Likes, Check-Ins– Recording User Actions
• Social Networks– Friends, Connections– Groups, Tags
Insurance Company Data
Account Information– Name, Address, etc– Account Status– Notes
A Data Modeling
Exercise
Insurance Company
Insurance Company
Insurance Company
Insurance Company
User Opened AccountDate: 05/26/2012Status: Success
Account ModifiedDate: 06/22/2012Action: Added Spouse
User Call LogDate: 07/24/2012Type: Complaint
2 Types of Data
User Opened AccountDate: 05/26/2012Status: Success
Account ModifiedDate: 06/22/2012Action: Added Spouse
User Call LogDate: 07/24/2012Type: Complaint
Rule of Thumb: Categories of Data Map Well to MongoDB Collections
Policies Activities
Policiespolicy = { name: “Kevin Hanson” employer: “10gen”, address: “555 University”, e-mail: “[email protected]”, twitter: “@hungarianhc”, spouse: “Yes”, dependents: “No”, dates: [
{start: 5/26/2012 10:12:00}, end: 5/26/2013 10:12:00}],
others: “No”}
Activities
activity = { user-id: “kevinhanson421” type: “account-opening”, status: “Success”, dates: 5/26/2012 10:12:00, related-doc: “/customer/kevinhanson421/open.pdf” }
User Opened AccountDate: 05/26/2012Status: Success
Account ModifiedDate: 06/22/2012Action: Added Spouse
User Call LogDate: 07/24/2012Type: Complaint
User Check-Ins
Activity Streams– Posts, Tweets, Check-Ins– Recording User Actions
Places
Q: Current locationA: Places near
location
User Generated Content
Places
Inserting a Place
var p = { name: “10gen HQ”, address: “578 Broadway, 7th Floor”, city: “New York”, zip: “10012”, tags: [“mongoDB”, “business”], latlong: [40.0, 72.0], tips: [{user: “kevin”, time: “3/15/2012”,tip: “Make sure to stop by for office hours!”}]}
> db.posts.save(p)
Updating Tips
db.places.update({name:"10gen HQ"}, {$push :{tips: {user:"Kevin", time:3/15/2012, tip:"stop by for office hours on Wednesdays from 4-6"}}}}
Querying Our Places• Creating Indexes
★ db.places.ensureIndex({tags:1})★ db.places.ensureIndex({name:1})★ db.places.ensureIndex({latlong:”2d”})
• Finding Places★ db.places.find({latlong:{$near:[40,70]}})
• Regular Expressions★ db.places.find({name: /^typeaheadstring/)
• Using Tags★ db.places.find({tags: “business”})
User Check-Ins
Places
Record User Check-Ins
Check-Ins
Users
Stats
Users
Stats
Usersuser1 = { name: “Kevin Hanson” e-mail: “[email protected]”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab]}
checkins [] = ObjectId reference to Check-Ins Collection
Check-Insuser1 = { place: “10gen HQ”, ts: 9/20/2010 10:12:00, userId: <object id of user>}
Every Check-In is Two Operations• Insert a Check-In Object (check-ins collection)• Update ($push) user object with check-in ID (users collection)
Simple Statsdb.checkins.find({place: “10gen HQ”)
db.checkins.find({place: “10gen HQ”}) .sort({ts:-1}).limit(10)
db.checkins.find({place: “10gen HQ”, ts: {$gt: midnight}}).count()
Stats w/ MapReducemapFunc = function() {emit(this.place, 1);}
reduceFunc = function(key, values) {return Array.sum(values);}
res = db.checkins.mapReduce(mapFunc,reduceFunc, {query: {timestamp: {$gt:nowminus3hrs}}})
res = [{_id:”10gen HQ”, value: 17}, ….., ….]
... or try using the new aggregation framework!
Adding More User Data
User Opened AccountDate: 05/26/2012Status: Success
Account ModifiedDate: 06/22/2012Action: Added Spouse
User Call LogDate: 07/24/2012Type: Complaint
Adding More User Data
User Opened AccountDate: 05/26/2012Status: Success
Account ModifiedDate: 06/22/2012Action: Added Spouse
User Call LogDate: 07/24/2012Type: Complaint
Click!
Click! Click!
Click!
Click!
Tracking Clicks
Policies Activities
Each Click Creates a New Doc
Policies Activities Clicks
Clicksclick = { user: “kevinhanson”, ts: 9/20/2010 10:12:00, link: “http://some-link-here.com/wherever”}
Now we can audit user activity...
db.clicks.find({user:”kevinhanson”}).sort({ts:-1})
Show me all of Kevin’s clicks sorted by timestamp.
Extending the Schemauser1 = { name: “Kevin Hanson” e-mail: “[email protected]”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab]}
Extending the Schemauser1 = { name: “Kevin Hanson” e-mail: “[email protected]”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab], friends: [7b47j62bk1d3c5621c1icv90, 1h11p62bf1d8c716za]}
Takeaways// User Data Fits Well in MongoDB> Flexible Data Model> Stay Agile; Make Changes> Many Customers in Production
// Application Patterns Drive Data Design> Optimize Data Model For Queries> Primary Use Cases Drive Design
// Adding Features Can Be Easy> Create New Data Structures> Extend Existing
@mongodb
conferences, appearances, and meetupshttp://www.10gen.com/events
http://bit.ly/mongo> Facebook | Twitter | LinkedIn
http://linkd.in/joinmongo
More info at http://www.mongodb.org/
[email protected]@hungarianhc