2013-02-28 97 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