2011-07-22 28 views
1

我期待在mongodb中創建一個簡單的基於推薦的系統,其中用戶可以使用代碼來邀請其他用戶。所有用戶將成爲相同代碼/組的一部分。該組的用戶也可以邀請其他人加入該組,或自己開始。在這種情況下,該用戶成爲兩個組(兩個不同的代碼)的一部分。有關在mongodb中創建基於引用的系統的建議?

我想要跟蹤的以下幾件事:

1)對於給定的代碼,有多少人你參考 2)碼是用戶的一部分(可以是許多代碼的一部分/組)

最簡單的集合包含所有的信息,我需要似乎是這樣的:

串碼 字符串用戶引發 串UserReceived

所以在集合中的這三個字段中,我總是可以告訴用戶發起了多少次代碼(引用某人)。他們提到的人。其中編碼/分組特定用戶是其中的一部分。

這似乎是最簡單的方法嗎?

回答

2

我不太清楚你的建議模式會如何以有效的方式爲你提供所需的信息。

我建議如下:

db.groups { 
    _id: <group code>, 
    creator: <UUID of creator>, 
} 

db.members { 
    _id: <UUID of group member>, 
    groupCode: <group code> 
    referrals: [ 
     <UUID of referred user> 
    ] 
    referralCount: <size of referrals array for speed/convenience> 
} 

CREATE GROUP : 
db.groups.save({_id: <group code>, creator:<UUID of creator>}) 
db.members.save({_id:<UUID of creator>, groupCode: <group code>}) 

REFER USER : 
db.members.update({_id: <UUID of referrer>}, {$push:{referrals: <UUID of referred user}, $inc:{referralCount:1}}) 

FOR A GIVEN CODE, HOW MANY PEOPLE DID YOU REFER : 
db.members.find({_id: <UUID of user>, groupCode: <group code>}) -> first result .referralCount 

WHICH CODES IS A USER PART OF : 
db.members.find({_id: <UUID of user>}) -> results .groupCode 

OR 

db.members.distinct("groupCode", {_id: <UUID of user>}) for a direct array of codes 

的原因我會分裂它,是因爲維護組內的成員列表文檔作爲嵌入式陣列將複雜某些更新,可能會碰到16MB文檔限制,並會大幅增加您的查詢的帶寬需求(請注意,在這種情況下,您必須爲每個成員查詢找到整個組文檔)。

希望有所幫助。

+0

是的,當我想到設計效率不是我關心的。我試圖想到我可以存儲的最簡單和最少量的數據,以便捕獲我需要的所有信息。但是這是一個很好的信息,因爲比我更有經驗的設計mongodb集合的人可以提出一個更好的方法,記住效率。謝謝! – mike