2012-01-12 87 views
1

我有用户,他们可以创建活动,用户有朋友,每个用户应该能够从朋友那里获得所有活动,单个活动可以有多个用户。Mongodb数据库设计

Users -> _id, name, friendList 
Activity -> _id, description, date, involvedUsers 

所以一个例子文件将是:

"User theo": 1, theo, array(mike, rutger, tijmen) 
"User mike": 2, mike, array(theo, rutger, tijmen) 

Activity x: 1, 'having fun with friends', {{todaydatetime}}, array(1, 2) 
Activity y: 2, 'going out', {{saturdaydatetime}}, array(1, 2) 

所以,现在如果在,他要得到那个麦克“将有乐趣的朋友”相同的,如果迈克登录“西奥”日志

如果他们选择星期六作为约会,Mike会得到Theo出去,Theo会得到Mike出去的活动。

我该如何做到这一点,我知道在MySql中使用连接等非常简单,但我怎样才能获得用户“friendlist”的所有活动并按特定日期过滤,例如给我所有活动周六正在发生。

+0

那么,为什么要使用MongoDB的?使用MySQL,你知道如何在那里做到这一点。 – 2012-01-12 14:58:50

+1

这不是我的问题,我必须使用MongoDb。 – randomKek 2012-01-12 15:00:39

+0

请问你为什么要? – 2012-01-12 15:08:43

回答

2

你可能要像(这是完全未经测试),和其他人是对的,如果你有太大(千)为您的朋友列表和您的参与,它可能会导致缩放问题:

collection users: 
{ 
    _id: objid, 
    name: "theo", 
    friends: [objid, objid, objid] /* these are user object ids */ 
} 

collection activities: 
{ 
    _id: objid, 
    desc: "having fun with friends", 
    date: new Date(), 
    involved: [objid, objid, objid] /* these are user object ids */ 
} 

我会做的确保索引的日期和参与。在这里看到更多信息的索引数组值:http://www.mongodb.org/display/DOCS/Multikeys

db.activities.ensureIndex({date:1}); 
db.activities.ensureIndex({involved:1}); 

所以要(从shell)选择参与活动的用户,你会怎么做:

var start_date = new Date(2012, 1, 14); 
var end_date = new Date(2012, 1, 15); 
var friends = db.users.findOne(_id: objid for user).friends; 
var activities = db.activities.find(
    { 
    date: {$gte : start_date}, 
    date: {$lte : end_date}, 
    involved : {$in : friends} 
    }); 
+0

我了解好友列表,但我只需要MongoDb,因为它在MongoDB中具有地理编码功能和性能。你会建议我什么MySql? – randomKek 2012-01-12 16:52:50

+0

我可能会使用mongodb。如果您最终需要使用不同的架构来支持更多的朋友或更多的朋友,那么您可以将其分解到不同的集合中 - 但是需要更多查找才能获得答案。 – 2012-01-12 16:55:15

+0

不应该是日期选择中的'$ lt',只能得到一天(否则根据我的理解,它也会选择第二天)? – 2014-11-03 08:06:31