【问题标题】:How to organize Mongo collections of a users system如何组织用户系统的 Mongo 集合
【发布时间】:2012-09-10 14:29:56
【问题描述】:

我是 noSQL 数据库 (MongoDB) 的新手,我不知道如何组织集合。我有一个用户系统,每个用户都有:

  • _id
  • 用户名
  • 密码
  • ...(更多基础数据)
  • 朋友
  • 信誉积分
  • 信誉点历史记录
  • 通知
  • 已加入的用户组

基本数据通常存储在集合users中,但我不知道如何存储朋友列表等复杂数据。

我应该在每个用户对象中(在用户集合中)存储一个_id数组之类的朋友,还是应该创建一个新集合来只存储朋友?如果我创建这个新集合,它应该像一个用户的 _id 及其朋友的数组,或者像用户 => 朋友 _id 这样的对。

通知和历史记录也是如此。我和朋友有同样的问题,但是这些情况下数组的大小可能要大得多,所以使用新集合的想法更强烈。

【问题讨论】:

标签: javascript node.js mongodb


【解决方案1】:

我假设您正在创建某种社交网络,其中每个用户的朋友都是其他用户。

在 MongoDB 中通常应避免仅表示文档之间关系的集合。在关系数据库中,您可以使用这些来连接表,但 MongoDB 不支持连接。

您应该为每个用户添加一组朋友。这是在 MongoDB 中实现多对多关系的常用方法。但是因为你有一个关系而不是一个聚合(朋友不是 拥有 用户 - 他们独立存在)你不应该将整个朋友对象放入这些数组中。取而代之的是,您应该使用可用于在用户集合中查找朋友的唯一标识符。这可以是朋友的 _id、DBRef 或朋友的姓名(仅当它们是唯一的并被索引时)。后一种解决方案将允许您获得用户朋友的可读列表,而无需请求所有引用的文档。

在用户文档中存储整个对象是有意义的反例可能是通知。向单个用户发送通知。没有用户,通知是没有意义的。如果没有收到通知的用户,您将永远不需要通知。当一个用户被删除时,它的通知可以被删除。因此,您可以将其直接存储在用户文档中。

【讨论】:

  • 谢谢。所以你会将所有通知和历史记录放在用户对象中?稍后使用 .find 仅获取您想要的用户字段(以提高性能)。
  • 是的,我就是这样做的。请注意我在您发表评论后添加到我的答案中的第二段。
猜你喜欢
  • 2021-03-12
  • 2021-12-30
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2018-12-25
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多