gpt4 book ai didi

MongoDB 在共享集合对象上存储特定于用户的数据

转载 作者:可可西里 更新时间:2023-11-01 09:46:45 24 4
gpt4 key购买 nike

我正在设计一个使用 MongoDB 处理 RSS 提要的应用程序。目前我的收藏如下:

Entry
fields: content, feed_id, title, publish_date, url

Feed
fields: description, title, url

User
fields: email_address
subscriptions (embedded collection; fields: feed_id, tags)

用户可以订阅从嵌入式订阅集合链接的提要。从订阅中,我可以获得用户应该看到的所有提要的列表以及相应的条目。

我应该如何存储特定于用户的条目状态信息(isRead、isStarred 等)?当用户查看条目时,我需要记录 isRead = 1。我需要能够执行的两个常见查询是:

  • 查找 isRead = 0 或当前不存在状态的特定提要的所有条目
  • 对于特定用户,使用 isRead = 1 标记发布日期之前的所有条目(这可能是数百甚至数千条记录,因此必须高效)

最佳答案

嗯,这是一个棘手的问题!

对我来说,存储未读条目的记录并在阅读时删除它们是有意义的。我基于这样的假设,即每个用户的已读帖子多于未读帖子,因此您最好不要将所有已读条目的文档永远保存在您的数据库中。如果您不必随身携带多年的历史记录,它还可以让您更轻松地不必担心 16MB 的文档大小限制。

对于加星标的条目,我会简单地向用户添加一个条目 ObjectId 数组。无需使这些订阅特定;以这种方式提取用户已加星标的项目列表会容易得多。

对于未读条目,情况稍微复杂一些。我仍然将它添加为一个数组,但为了满足您能够在特定日期之前快速标记为已读条目的要求,我将非规范化并将发布日期与条目 ObjectId 一起保存在新的“UnreadEntry”中文档。

User
fields: email_address, starred_entries[]
subscriptions (embedded collection; fields: feed_id, tags, unread_entries[])

UnreadEntry
fields: id is Entry ObjectId, publish_date

您需要注意文档限制,但 16MB 是一大堆未读条目/提要,因此请现实地考虑这是否是您真正需要担心的限制。 (如果是,将 User.subscriptions 分解为它自己的文档应该相当简单。)

现在您的两个查询都变得相当容易编写:

特定供稿的所有未读条目:user.subscriptions.find(feedID).unread_entries

将发布日期之前的所有条目标记为阅读:user.subscriptions.find(feedID).unread_entries.where(publish_date.lte => my_date).delete_all

当然,如果您只需要将提要中的所有条目标记为已读,那非常简单:user.subscriptions.find(feedID).unread_entries.delete_all

关于MongoDB 在共享集合对象上存储特定于用户的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8032283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com