如何使用mongoDB对象正确“关联”多个项目而不使用关系本身?

时间:2017-12-25 03:03:03

标签: mongodb mongoose associations

假设我有一些用户在观看我的应用程序时收到有关他们选择的社交媒体活动帐户等内容的通知。

我希望能够为用户提供一个选项,以便在他们离线时看到他们“错过”的更新。

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

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

另一方面,Mongoose虽然“支持”关联,却会遇到同样的问题,但多对多关联会在多个地方出现这种重复数据。

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

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

1 个答案:

答案 0 :(得分:1)

而不是跟踪错过的通知,而是考虑跟踪收到的最后一个通知。根据文档:

,MongoDB的ObjectId构造如下
  • 一个4字节的值,表示自Unix纪元以来的秒数,
  • 一个3字节的机器标识符,
  • 一个2字节的进程ID,
  • 一个3字节的计数器,以随机值开始。

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

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