假设我有一些用户在观看我的应用程序时收到有关他们选择的社交媒体活动帐户等内容的通知。
我希望能够为用户提供一个选项,以便在他们离线时看到他们“错过”的更新。
如果我将Notification的MongoDB _id
存储在附加到User模型的数据对象中,我预见到他们已经注册了所有频道并且错过了几兆字节的更新的情况,这使得用户对象非常大:
{ name: 'John'
missedNotifications: [ /* 10 million items */ ]
}
另一方面,Mongoose虽然“支持”关联,却会遇到同样的问题,但多对多关联会在多个地方出现这种重复数据。
如果Notification对象带有一个已经看过它的用户列表,几年后扫描整个Notifications集合可能会非常耗时。
是否有第三种方法可以跟踪谁看到了什么并正确修改模型?
答案 0 :(得分:1)
而不是跟踪错过的通知,而是考虑跟踪收到的最后一个通知。根据文档:
,MongoDB的ObjectId
构造如下
由于这些ID的构建方式,您通常可以在$gt
字段上执行_id
搜索,以检索在上一个已知ID之后插入的所有文档(例如db.notifications.find({_id: {$gt: last_known_id}})
)。
通过这种方式,您可以检索错过的所有新通知,同时仅跟踪一个通知ID。如果您需要跟踪多种通知类型,并希望在通知跟踪中获得更大的粒度,那么只需跟踪每种类型的上次查看的文档ID。