2013-02-28 96 views
1

我正在设计一个博客网站的新闻提要。我试图设计Feed,以便让来自朋友的近期活动的博客将这些博客保留在Feed的顶部,同时让您无需参与向列表底部倒下。基本上,想想你的Facebook饲料,但博客。MongoDB Feed设计和查询

这里是目前的设计我有,但我愿意接受建议,使这个更容易从选择:

{ 
_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:这个单一的博客集合是一个好的设计,还是应该将操作规范化为一个单独的集合?

回答

0

所以你展示的这个文档代表了一篇博文,这些评论,标签,喜欢等等?如果是这种情况,这不是太糟糕。

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.

就个人而言,我会设置一个单独的收集倾倒用户的饲料事件之中。然后当事件发生时,只需将事件推入文档中的事件数组中。

它们会自动排序,您可以根据需要对数组进行切片并加盖。

但是,随着文档的增长,您需要小心并分配最初大量的内存,否则会遇到磁盘上的文档移动缓慢。

查看updates

编辑补充意见导语:

有两种方法可以做到这一点。要么是每个文档都是供稿事件的集合,要么是每个文档都是用户的完整供稿。各有优点和缺点。如果您确定在最近的1000个Feed事件上进行了限制,我将使用该文档来表示整个Feed策略。

因此,我将创建像

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

其中饲料是饲料事件对象的阵列的文档结构。这些像

{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喜欢帖子,请将Feed文档推送到所有用户A的好友Feed中。

这适用于小型饲料。如果您需要非常大的Feed,我建议为每个Feed条目使用一个文档,并将收件人用户的ID分割并索引日期字段。这更接近于twitter/fb非常大的提要,但它们使用的mysql可以说比mongodb更适合这个特定的用例。

+0

我想更详细地了解如何为转储用户供稿事件信息设置单独的集合。你的意思是会有一个所有用户事件进入的收集设置?如果是这样,那么如何删除列表中的重复内容,因为如果对帖子有2条评论,那么您有2条活动,并且您不希望帖子在该Feed中显示两次。最后,是否可以使用1查找查询从基于事件表的帖子表中选择数据?谢谢! – Glitches 2013-03-01 00:25:19

+0

有两种方法可以做到这一点。要么是每个文档都是供稿事件的集合,要么是每个文档都是用户的完整供稿。各有优点和缺点。如果您确定在最近的1000个Feed事件上进行了限制,我将使用该文档来表示整个Feed策略。 – 2013-03-01 00:27:38

+0

我在编辑我的评论,因为你回答:)请参阅上面的评论。您将整个Feed作为文档的想法非常有趣。在那种情况下,你会如何更新Feed?我想你仍然需要查询数据库才能找到新数据来对Feed进行排序。这可能会破坏目的,因为您将执行更新Feed的工作,以使其上的数据尽可能靠近生活。 – Glitches 2013-03-01 00:38:53