2012-01-12 84 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