我正在为博客网站设计新闻Feed。我正在尝试设计Feed,以便博客通过您朋友最近的活动将这些博客保留在您的Feed的顶部,而您没有参与的Feed会落在列表底部。基本上,想想你的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,我如何选择Feed,以便结果中的帖子顺序由他们决定,而不是由稍后在Feed中标记的用户126。
问题2:这个博客的单一集合是一个好的设计,还是应该将行为规范化为一个单独的集合?
答案 0 :(得分: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
就个人而言,我会设置一个单独的集合来将用户的feed事件转储到。然后,当事件发生时,只需将事件推送到文档中的事件数组中。
它们将自动排序,您可以根据需要对阵列进行切片并封顶。
然而,对于那些增长的文档,您需要小心并分配初始大量的内存,否则您将在磁盘上遇到文档移动缓慢。
查看updates
上的模糊信息修改其他评论:
有两种方法可以做到这一点。每个文档都是Feed事件的集合,或者每个文档都是用户的整个Feed的集合。每个都有优点和缺点。如果您可以在1000个最近的Feed事件中限制它,我会使用该文档来表示整个Feed方法。
所以我会创建一个像
这样的文档结构 {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)}
要更新此Feed,您只需在Feed事件发生时将新的Feed文档推送到Feed数组。因此,如果用户A喜欢帖子,请将Feed文档推送到所有用户A的朋友提要。
这适用于小型Feed。如果您需要非常大的Feed,我建议每个Feed条目使用一个文档,并清除收件人用户的ID并索引日期字段。这越来越接近于twitter / fb中非常大的提要如何工作,但他们使用的mysql在这个特定的用例中可能比mongodb更好。