我有一个系列: 用户
[
{ _id: bob, name: Bob, email:..},
{ _id: rob, name: Rob, email:..},
{ _id: job, name: Job, email:..},
...
{ _id: zzz, name: ZzZ, email:...}
]
我需要一张映射表,显示谁跟随谁: 我有2个阵列来保持粉丝和粉丝。同样的问题,数组可能会爆炸。
user_followers collection like this:
[
{
user: Bob,
followers: [Mike, Steve, John, Mark, Raj],
..,
following: [Alex, John, Mark]]
}
]
我怎么能有这样的集合?
答案 0 :(得分:0)
你选择#3对我来说似乎是最好的选择(考虑到你所谈论的音量,这是唯一的选择),原因是你确定的。您的选项#1实际上不是一个选项,因为您在查询Mike所关注的所有用户时遇到了麻烦(您只能轻松查询谁是特定用户的关注者)。
现在对于选项#3和你的id问题,如果我没有弄错(免责声明:我在大约一年内没有使用过mongodb),你可以使用_id
作为一个对象。
因此,对于您想要的内容,您只需使用{ user: 'bob', follower: 'Mike' }
类型的对象作为_id
(_id
的要求是唯一的),因此会有类似
{
_id: {
user: 'bob',
follower: 'Mike'
}
}
<强>更新强>
根据documentation,我似乎正确地记住了使用_id
对象的可能性:
文档对字段名称有以下限制:
- 字段名
_id
保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除数组之外的任何类型。- 字段名称不能以
$
字符开头。- 字段名称不能包含
.
字符。
更新2
虽然使用{ user, follower }
对象作为id,但您可能需要有效查询才能在_id.user
和_id.follower
上添加两个索引(或至少{{1}上的一个键}})有效地查询“bob之后的所有用户”和“bob跟随的所有用户”。
_id.follower, _id.user
索引可以有效查询_id
索引或_id.follower
索引_id.follower, _id.user
索引才会有效率。