Webinar: User Data Management with MongoDB

Post on 25-May-2015

1.539 views 4 download

Tags:

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.

Transcript of Webinar: User Data Management with MongoDB

User Data Managementwith

Please stand by...We’ll begin shortly.

Q&A to follow the webinar

Recording Available 24 Hours After EventOther issues? E-mail webinars@10gen.com

Osmar OlivoConsulting Engineer, 10genOz@10gen.com

Friday, July 12, 13

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

Friday, July 12, 13

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

Friday, July 12, 13

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

Friday, July 12, 13

Insurance Company Data

Account Information– Name, Address, etc– Account Status– Notes

A Data Modeling

Exercise

Friday, July 12, 13

Insurance Company

Friday, July 12, 13

Insurance Company

Friday, July 12, 13

Insurance Company

User Opened Date: 05/26/2012Status: Success

Account ModifiedDate: 06/22/2012Action: Added

User Call LogDate: 07/24/2012Type: Complaint

Friday, July 12, 13

2 Types of Data

User Opened Date: 05/26/2012Status: Success

Account ModifiedDate: 06/22/2012Action: Added

User Call LogDate: 07/24/2012Type: Complaint

Friday, July 12, 13

Rule of Thumb: Categories of Data Map Well to MongoDB Collections

Policies Activities

Friday, July 12, 13

Policiespolicy = { name: “John Smith” employer: “10gen”, address: “555 Fictional Ave”, e-mail: “me@john.smith.com”, spouse: “Yes”, dependents: “No”, dates: [

{start: 5/26/2013 10:12:00}, end: 5/26/2023 10:12:00}],

others: “No”}

Friday, July 12, 13

Activities

activity = { user-id: “JohnSmith421” type: “account-opening”, status: “Success”, dates: 5/26/2012 10:12:00, related-doc: “/customer/JohnSmith421/open.pdf” }

User Opened AccountDate: 05/26/2012Status: Success

Account ModifiedDate: 06/22/2012Action: Added Spouse

User Call LogDate: 07/24/2012Type: Complaint

Friday, July 12, 13

User Check-Ins

Activity Streams– Posts, Tweets, Check-Ins– Recording User Actions

Friday, July 12, 13

Places

Q: Current locationA: Places near

location

User Generated Content

PlacesFriday, July 12, 13

Inserting a Place

var p = { name: “10gen HQ”, address: “229 W 43rd St”, city: “New York”, zip: “10036”, tags: [“mongoDB”, “business”], latlong: [40.0, 72.0], tips: [{user: “John Smith”, time: “3/15/2013”,tip: “Make sure to stop by for office hours!”}]}

> db.posts.save(p)

Friday, July 12, 13

Updating Tips

db.places.update({name:"10gen HQ"}, {$push :{tips: {user:"John", time:3/15/2012, tip:"stop by for office hours on Wednesdays from 4-6"}}}}

Friday, July 12, 13

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”})

Friday, July 12, 13

User Check-Ins

Places

Record User Check-Ins

Check-Ins

Users

Stats

Users

Stats

Friday, July 12, 13

Usersuser1 = { name: “John Smith” e-mail: “me@John.Smith.com”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab]}

checkins [] = ObjectId reference to Check-Ins Collection

Friday, July 12, 13

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)

Friday, July 12, 13

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()

Friday, July 12, 13

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!

Friday, July 12, 13

Account ModifiedDate: 06/22/2012Action: Added

Adding More User Data

User Opened Date: 05/26/2012Status: Success

User Call LogDate: 07/24/2012Type: Complaint

Friday, July 12, 13

Account ModifiedDate: 06/22/2012Action: Added

Adding More User Data

Click!

Click! Click!

User Opened Date: 05/26/2012Status: Success

Click!

User Call LogDate: 07/24/2012Type: Complaint

Click!

Friday, July 12, 13

Tracking Clicks

Policies Activities

Friday, July 12, 13

Each Click Creates a New Doc

Policies Activities Clicks

Friday, July 12, 13

Clicksclick = { user: “JohnSmith”, ts: 9/20/2010 10:12:00, link: “http://some-link-here.com/wherever”}

Now we can audit user activity...

db.clicks.find({user:”JohnSmith”}).sort({ts:-1})

Show me all of John’s clicks sorted by timestamp.

Friday, July 12, 13

Extending the Schemauser1 = { name: “John Smith” e-mail: “me@John.Smith.com”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab]}

Friday, July 12, 13

Extending the Schemauser1 = { name: “John Smith” e-mail: “me@John.Smith.com”, check-ins: [4b97e62bf1d8c7152c9ccb74, 5a20e62bf1d8c736ab], friends: [7b47j62bk1d3c5621c1icv90, 1h11p62bf1d8c716za]}

Friday, July 12, 13

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

Friday, July 12, 13

@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/

Questions?Oz@10gen.com

Friday, July 12, 13