You are on page 1of 25

Building a Social Network with MongoDB

Brian Zambrano

MongoSV
December 3, 2010

Friday, December 3, 2010


Eventbrite Brand Tenets

Friday, December 3, 2010


Eventbrite Brand Tenets

Friday, December 3, 2010


Social Recommendations

Friday, December 3, 2010


Eventbrites Social Graph

Friday, December 3, 2010


Eventbrites Social Graph

Friday, December 3, 2010


Neighbors

Friday, December 3, 2010


Challenges

Dynamic
Neighbors change often
Neighbors events change often
Flexibility
Want to incorporate other social graphs
Product may evolve quickly
Performance
We need really fast reads
Frequent writes
8

Friday, December 3, 2010


Why MongoDB?

Performance
Flexible schema design
Easy to work with
We felt comfortable MongoDB would mature as
our needs became more demanding

Friday, December 3, 2010


Providing Recommendations

1. User visits http://eventbrite.com/mytickets/


2. Fetch neighbors
3. Fetch neighbors events
4. Score each possible event
5. Return recommendations

10

Friday, December 3, 2010


MongoDB setup

One non-sharded replica set


Two DBs on Large EC2 instances
One arbiter
Three collections
Users
Events
Orders

11

Friday, December 3, 2010


User Data in MongoDB

{ "_id": 4558992, Unique User Id


}

12

Friday, December 3, 2010


User Data in MongoDB

{ "_id": 4558992,
"events" : {
"all_ids": [ 116706, 179487, 16389, 827496 ],
"curr_ids": [ 827496 ],

}
},
Past and current
attendance

13

Friday, December 3, 2010


User Data in MongoDB

{ "_id": 4558992,
"events" : {
"all_ids": [ 116706, 179487, 16389, 827496 ],
"curr_ids": [ 827496 ],
},
"nns" : [
[ 2816442, 0.2 ],
[ 1615962, 0.047619047619047616 ],
],
} Nearest neighbors
(user_id, score)

14

Friday, December 3, 2010


User Data in MongoDB

{ "_id": 4558992,
"events" : {
"all_ids": [ 116706, 179487, 16389, 827496 ],
"curr_ids": [ 827496 ],
},
"nns" : [
[ 2816442, 0.2 ],
[ 1615962, 0.047619047619047616 ],
],
"fb" : {
"_id" : 4808871, Facebook data
"name" : "Brian Zambrano",
"location" : "San Francisco, California",
"friends" : [ 568876525, 569507467, 569559792 ],
},
}

15

Friday, December 3, 2010


MongoDB Indexes

{ "_id": 4558992,
"events" : {
"all_ids": [ 116706, 179487, 16389, 827496 ],
"curr_ids": [ 827496 ],
},
"nns" : [
[ 2816442, 0.2 ],
[ 1615962, 0.047619047619047616 ],
],
"fb" : {
"_id" : 4808871,
"name" : "Brian Zambrano",
"location" : "San Francisco, California",
"friends" : [ 568876525, 569507467, 569559792],
},
}

16

Friday, December 3, 2010


Events Collection
> db.events.findOne({_id: 799177})
{
"_id" : 799177,
"uid" : 2989008,
"title" : "MongoSV",
"venue" : {
"loc" : [
37.413042,
-122.071106
],
"state" : "CA",
"id" : 508093,
"city" : "Mountain View"
},
"logo" : "758915938.png",
"shortname" : "mongosv",
"start_date" : "Fri Dec 03 2010 01:00:00 GMT-0800 (PST)"
}

17

Friday, December 3, 2010


Orders Collection
> db.orders.find({_eid: 799177})
{ "_id" : 17464215, "_uid" : 1111195, "_eid" : 799177 }
{ "_id" : 17575729, "_uid" : 6970539, "_eid" : 799177 }
{ "_id" : 17582343, "_uid" : 3092687, "_eid" : 799177 }
{ "_id" : 17588693, "_uid" : 2255017, "_eid" : 799177 }
{ "_id" : 17589589, "_uid" : 6976917, "_eid" : 799177 }
{ "_id" : 17601979, "_uid" : 885441, "_eid" : 799177 }
{ "_id" : 17603085, "_uid" : 2500199, "_eid" : 799177 }
{ "_id" : 17608289, "_uid" : 6984367, "_eid" : 799177 }
{ "_id" : 17681965, "_uid" : 628459, "_eid" : 799177 }
{ "_id" : 17684489, "_uid" : 7017999, "_eid" : 799177 }
{ "_id" : 17689673, "_uid" : 7020133, "_eid" : 799177 }
{ "_id" : 17728267, "_uid" : 7036607, "_eid" : 799177 }
has more

18

Friday, December 3, 2010


Recommended Events Query

Two + n queries
1. Get neighbors
nns = db.users.find({_id : {$in : user.nn_ids}})

2. Get possible event recommendations:


db.events.find({_id : {$in : nns.events.all}})

n.For each event, get total attendee count


db.orders.find({_eid : event_id})

19

Friday, December 3, 2010


Recommended Events Query

Two + n queries
1. Get neighbors
nns = db.users.find({_id : {$in : user.nn_ids}})

2. Get possible event recommendations:


db.events.find({_id : {$in : nns.events.all}})

n.For each event, get total attendee count


db.orders.find({_eid : event_id})

Optimization opportunity:
Embed orders in Event records

20

Friday, December 3, 2010


Updating Neighbors
Two queries, one update
1. Get all orders for a users past events:
uids = db.orders.find({_id : {$in : user.events.all}})

2. Get all neighbors:


nns = db.users.find({_id : {$in : uids}})

Score neighbors
3. Update nn_ids
db.users.update({_id : uid},
{$set : {nn_ids: nn}})

21

Friday, December 3, 2010


Facebook Friends Events
Two queries
1. Get FB friends
db.users.find({fb._id : {$in : fb.friends}})

2. Get events FB friends are attending


db.events.find({_id : {$in : fb_friends_events}})

22

Friday, December 3, 2010


The Future

Incorporate other social networks


Iterate scoring algorithm
Count recommendation impressions

23

Friday, December 3, 2010


Were hiring!
http://www.eventbrite.com/jobs/

24

Friday, December 3, 2010


Thanks!

Brian Zambrano <brianz@eventbrite.com>

Eventbrites new Facebook recommendations power


social event discovery: http://bit.ly/gRVS7I

Social Commerce: A First Look at the Numbers:


http://bit.ly/gXeg9Q

25

Friday, December 3, 2010

You might also like