用户加入群组的MongoDB模式策略

Ser*_*pia 4 mongodb mongodb-query

想象一下使用MongoDB的Facebook群组功能。构造数据的最佳方法是什么?

对这些数据的主要操作将是查找属于该组的用户,并确定用户X是否是该组的成员。

一种选择是在Group文档中包含字符串数组。

{
  name: "Pets United",
  members: [
    "iuahsdfuhasdfasdf",
    "qwefqwefqwefqweff",
    "ioeroigkergnknmkm"
  ]
}
Run Code Online (Sandbox Code Playgroud)

另一个可能是membershipUser文档中具有一组组ID 。

{ 
  firstName: "Sergio",
  age: 27,
  groups: [
    "iuahsdfuhasdfasdf",
    "qwefqwefqwefqweff",
    "ioeroigkergnknmkm"
  ]
}
Run Code Online (Sandbox Code Playgroud)

如果我希望一个小组有成千上万的用户,那么您认为哪个更好?

Jos*_*eam 5

TL; DR这是在管理文档和查询那些文档之间进行权衡的过程。

请记住,MongoDB文档的大小限制为16MB(使用包含字符串的数组将永远需要它,但是仍然可以)。我可能会做“人属于组”而不是“组包含人”的关系:

{ 
  firstName: "Sergio",
  age: 27,
  groups: [
    "iuahsdfuhasdfasdf",
    "qwefqwefqwefqweff",
    "ioeroigkergnknmkm"
  ]
}
Run Code Online (Sandbox Code Playgroud)

与成千上万的成员相比,包含成千上万的成员的可能性更大,因此,如果根本不考虑文档大小限制(也许不会,但无论如何),我将选择“您建议的人与团体的关系。

还请记住您将如何查询数据。在第一个示例(“组包含人员”)中,要在组页面中显示用户,您需要执行以下操作:

people.find({ _id: { $in: group.members } })
Run Code Online (Sandbox Code Playgroud)

而查询其他方法:

people.find({ $where: 'this.groups.indexOf(group) > -1' })
Run Code Online (Sandbox Code Playgroud)

这些只是示例,说明了执行方法(可能还有其他方法)。