我希望在mongodb中创建一个简单的基于推荐的系统,用户可以在其中使用代码来邀请其他用户。所有用户都将成为同一代码/组的一部分。该组的用户还可以邀请其他人加入该组或开始他们自己的组。在这种情况下,该用户成为两个组的一部分(两个不同的代码)。
我想跟踪以下事项:
1)对于给定的代码,您引用了多少人 2)哪些代码是用户的一部分(可以是许多代码/组的一部分)
包含我需要的所有信息的最简单的集合似乎是:
字符串代码 string UserInitiated 字符串UserReceived
因此,对于集合中的这三个字段,我总能告诉用户启动代码的次数(引用某人)。他们提到了谁。特定用户属于哪个代码/组。
这看起来几乎是最简单的方法吗?
答案 0 :(得分: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文档限制并且会大大增加查询的带宽需求(请注意在这种情况下,必须为每个成员查询找到整个组文档。
希望有所帮助。