【问题标题】:MongoDB storing user-specific data on shared collection objectsMongoDB 在共享集合对象上存储用户特定的数据
【发布时间】:2011-12-23 08:30:51
【问题描述】:

我正在设计一个使用 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 标记发布日期之前的所有条目(这可能是数百甚至数千条记录,因此必须高效)

【问题讨论】:

    标签: mongodb schema mongoid


    【解决方案1】:

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

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

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

    对于未读条目,它有点复杂。我仍然会将其添加为数组,但为了满足您能够在特定日期之前快速标记为已读条目的要求,我将非规范化并将发布日期与条目 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

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多