javascript - 如何组织用户系统的 Mongo 集合

标签 javascript node.js mongodb

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

  • _id
  • Username
  • Password
  • ... (more basic data)
  • Friends
  • Reputation points
  • History of the reputation points
  • Notifications
  • User groups that has joined

基本数据通常存储在users集合中,但我不知道如何存储像 friend 列表这样的复杂数据。

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

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

最佳答案

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

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

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

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

关于javascript - 如何组织用户系统的 Mongo 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353812/

相关文章:

javascript - 图表弧在刷新后收缩

javascript - IE 事件回调对象 JavaScript

javascript - 为什么我们要在 tearDown 中删除 [object].[property](单元测试)

node.js - 发送后无法设置 header 。使用智威汤逊

mongodb - 用 Go 编写的程序打开许多与 mongoDB 的连接

javascript - 如何使用 Node 在 mongoose 中使 isModified 为真

javascript - 通过Android WebView中的javascript检测点击HTML按钮

javascript - 使用 node-mysql 同时查询

javascript - 操作 `users.insertOne()` 缓冲在 10000ms 后超时,Node.js,MongooseError

javascript - mongodb node.js 客户端,连接挂起