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

问题描述 投票:1回答:1

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

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

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

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

另一方面,Mongoose虽然“支持”关联类似于同一个问题,但多对多关联会在几个地方出现这种重复数据。

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

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

mongodb mongoose associations
1个回答
1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.