如何在MongoDB中设计这个映射(很多:很多)?

时间:2014-03-08 00:54:48

标签: mongodb

我有一个系列: 用户

[
  { _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]]
      }
    ]

我怎么能有这样的集合?

1 个答案:

答案 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索引可以有效查询
  • “所有关注bob的用户”
  • “bob关注的所有用户”都不能,并且很可能需要_id索引或_id.follower索引
  • 像“所有使用bob或jane的用户”之类的查询只有_id.follower, _id.user索引才会有效率。