2

我正在为博客网站设计新闻提要。我正在尝试设计提要,以便您朋友最近活动的博客将这些博客保留在提要的顶部,而您没有参与的提要则落在列表的底部。基本上,想想你的 Facebook 提要,但对于博客。

这是我目前的设计,但我愿意接受建议,以便更容易选择:

{
_id: 1,
author: {first: "John", last: "Doe", id: 123},
title: "This is a test post.",
body: "This is the body of my post."
date: new Date("Feb 1, 2013"),
edited: new Date("Feb 2, 2013"),
comments: [
    {
        author: {first: "Jane", last: "Doe", id: 124},
        date: new Date("Feb 2, 2013"),
        comment: "Awesome post."
    },
],
likes: [
    {
        who: {first: "Black", last: "Smith", id: 125},
        when: new Date("Feb 3, 2013")
    }
],
tagged: [
    {
        who: {first: "Black", last: "Smith", id: 126},
        when: new Date("Feb 4, 2013")
    }
]}

问题 1:假设我的朋友的 id 为 124 和 125,我如何选择提要,以便此帖子在结果中的顺序是他们,而不是稍后在提要中标记的用户 126。

问题 2:这个单一的博客集合是一个好的设计,还是我应该将操作规范化到一个单独的集合中?

4

1 回答 1

2

所以你展示的这个文件代表了一篇博客文章,那些是评论、标签、喜欢等?如果是这样的话,这还不算太糟糕。

1.

db.posts.find({'$or':[{'comments.author.id':{$in:[some list of friends]}}, {'likes.who.id':{$in:[some list of friends]}}, {'tagged.who.id':{$in:[some list of friends]}}]}).sort({date:-1})

这将为您提供所有您的朋友有活动的帖子,按帖子的日期降序排序。我认为 mongodb 尚不支持高级排序(如评论、喜欢或标签中日期的最小/最大值),因此按评论、喜欢或标签之一进行排序或按发布日期排序是使用此模型的最佳选择。

2.

就个人而言,我会设置一个单独的集合来将用户的提要事件转储到其中。然后当事件发生时,只需将事件推送到文档中的事件数组中。

它们将自动排序,您可以根据需要对数组进行切片和封盖。

但是,对于像这样增长的文档,您需要小心并分配初始相当大的内存量,否则您将遇到磁盘上的文档移动缓慢。

查看更新的简介

编辑附加评论:

有两种方法可以做到这一点。每个文档都是提要事件的集合,或者每个文档都是用户的整个提要的集合。每个都有优点和缺点。如果您可以将其限制在 1000 个最近的提要事件中,我将使用该文档来表示整个提要方法。

所以我会创建一个文档结构,比如

{userid:1, feed:[(feed objects)]}

其中 feed 是一个 feed 事件对象数组。这些应该是子文档,例如

{id:(a users id), name:(a users name), type:(an int for like/comment/tag), date:(some iso date), postName:(the name of the post acted on), postId:(the id of the post acted on)}

要更新此提要,您只需在提要事件发生时将新提要文档推送到提要数组中。因此,如果用户 A 喜欢某个帖子,则将提要文档推送到用户 A 的所有朋友提要上。

这适用于小提要。如果您需要一个非常大的提要,我建议您对每个提要条目使用一个文档,并将收件人用户的 ID 分片并索引日期字段。这越来越接近 twitter/fb 上非常大的提要的工作方式,但他们使用 mysql,对于这个特定的用例来说,这可以说比 mongodb 更好。

于 2013-02-28T22:06:02.697 回答