如何在不使用关系本身的情况下使用 mongoDB 对象正确 "associate" 多个项目?

How to properly "associate" multiple items with a mongoDB object without using relations per se?

假设我有许多用户在观看我的应用程序以获取有关他们选择的社交媒体 activity 帐户等内容的通知。

我希望能够让用户在离线时看到他们 "missed" 更新的选项。

如果我将通知的 MongoDB _id 存储在附加到用户模型的数据对象中,我预见到他们已经注册了所有频道并且错过了几兆字节的情况更新,使用户对象非常大:

{ name: 'John'
  missedNotifications: [ /* 10 million items */ ]
}

另一方面,Mongoose,虽然 "supports" 关联会遇到同样的问题,但多对多关联会在多个地方有重复数据。

如果 Notification 对象携带一个用户是否看过它的列表,几年后,扫描整个 Notifications 集合可能会变得非常耗时。

是否有第三种方法可以跟踪谁看到了什么并正确修改模型?

与其跟踪错过的通知,不如考虑跟踪最后收到的通知。根据文档,MongoDB 的 ObjectId 构造如下:

  • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
  • 一个 3 字节的机器标识符,
  • 一个 2 字节的进程 ID,并且
  • 一个 3 字节的计数器,以随机值开头。

由于这些 ID 的构造方式,您通常可以在 _id 字段上执行 $gt 搜索,以检索在先前已知 ID 之后插入的所有文档(例如 db.notifications.find({_id: {$gt: last_known_id}})).

通过这种方式,您可以检索所有错过的新通知,同时只跟踪一个通知 ID。如果您需要跟踪多种通知类型并希望在通知跟踪中具有更大的粒度,那么只需跟踪每种类型的最后查看的文档 ID。