2013-04-25 37 views
0

我們有每天都有一定數量的視圖的視頻。MongoDB的結構統計數據

我在想這樣做的:

{ 
    video_name: "Blabla" 
    stats: [ 
     {day: x, views: 342} 
     {day: x, views: 342} 
    ] 
} 

然而,從我在線閱讀分析/數據的東西,人們往往喜歡分別收集,所以更是這樣的:

{ 
    video_name: "Blabla" 
} 

{day: x, views: 342, video_id: y} 
{day: x, views: 342, video_id: y} 

您的觀點是什麼?

+0

您的用戶需要什麼,以及您的查詢將如何構建?將統計信息放入單個文檔/視頻中可能意味着您將達到16MB MongoDB文檔限制。 – WiredPrairie 2013-04-26 00:52:51

回答

1

這個任務是經典的聚合框架:http://docs.mongodb.org/manual/core/aggregation/ 的第一個變體,你可以使用這樣的事情:

test> db.video.aggregate([{$unwind:'$stats'}, {$group:{_id:{name:'$video_name', day:'$stats.day'}, views:{$sum:'$stats.views'}}}]) 
{ 
    "result" : [ 
     { 
      "_id" : { 
       "name" : "Blabla2", 
       "day" : 3 
      }, 
      "views" : 344 
     }, 
     { 
      "_id" : { 
       "name" : "Blabla2", 
       "day" : 1 
      }, 
      "views" : 684 
     }, 
     { 
      "_id" : { 
       "name" : "Blabla", 
       "day" : 2 
      }, 
      "views" : 342 
     }, 
     { 
      "_id" : { 
       "name" : "Blabla2", 
       "day" : 2 
      }, 
      "views" : 342 
     }, 
     { 
      "_id" : { 
       "name" : "Blabla", 
       "day" : 1 
      }, 
      "views" : 342 
     } 
    ], 
    "ok" : 1 

但你可能不得不在未來的問題,如果您的視頻的次數會像雪崩增加。 您可以使用幫助$匹配操作精確計算特定日期的統計數據,但這是臨時解決方案。

好主意是一個變化的數據模型更簡單(如果你能):

{ 
    video_name: "Blabla", 
    day: x, 
    views: 342} 
} 
在這個模型中

,你不依賴於文件和聚合框架的大小,可以幫助您創建analitical觀點:

db.video.aggregate([{$group:{_id:{name:'$video_name', day:'$day'}, views:{$sum:'$views'}}}]) 

你可以簡單的選擇任何一天或一天​​的時間間隔,你可以按視頻或視頻,一天的名稱,你可以免費計算任何統計數據,如你所願;)

+0

和另一個好主意:保存一些aggegation統計在不同的收集和定期更新這個爲了分析目的 你必須分開oltp和analitics – 2013-04-26 07:00:17

+0

如果我正確地得到他正確的做事的方式,是有一個分離的集合,並使用聚合框架做的東西? – Hartator 2013-04-26 17:12:32

+0

是的,這是最好的方法。如果您將統計數據和數據混合在一起,則在更新時總會遇到困難,試想一下,您將如何更新視圖數量以及它需要什麼代碼 – 2013-04-26 21:18:54