2011-04-19 107 views
15

我們正在使用MongoDB中存儲大量的分析數據,如瀏覽和點擊的計劃。我不確定在MongoDB中構建文檔的最佳方式,以幫助查詢和減少數據庫大小。MongoDB的途徑來存儲大量的度量/分析數據

我們需要記錄行動agains一個頁面名稱,客戶端和行動的類型。理想情況下,我們需要統計數據按照年/月/日/小時的水平進行計算,我們不需要或不關心每秒或每分鐘的觀看次數。儘管這個文檔結構看起來不錯,但我知道100個訪問者會生成100個新文檔。

{ 
    "_id" : ObjectId("4dabdef81a34961506040000"), 
    "pagename" : "Hello", 
    "action" : "view", 
    "client" : "client-name", 
    "time" : Date("Mon Apr 18 07:49:28 2011") 
} 

是否有這樣做的最佳實踐方法,或者使用$incCapped Collections

回答

15

更新答案

在蒙戈外殼砍死在一起:

use pagestats; 

// a little helper function 
var pagePerHour = function(pagename) { 
    d = new Date(); 
    return { 
     page : pagename, 
     year: d.getUTCFullYear(), 
     month: d.getUTCMonth(), 
     day : d.getUTCDate(), 
     hour: d.getUTCHours(), 
    } 
} 

// a pageview happened 
db.pagestats.update(
    pagePerHour('Hello'), 
    { $inc : { views : 1 }}, 
    true); //we want to upsert 

// somebody tweeted our page twice! 
db.pagestats.update(
    pagePerHour('Hello'), 
    { $inc : { tweets : 2 }}, 
    true); //we want to upsert 

db.pagestats.find(); 
// { "_id" : ObjectId("4dafe88a02662f38b4a20193"), 
// "year" : 2011, "day" : 21, "hour" : 8, "month" : 3, 
// "page" : "Hello", 
// "tweets" : 2, "views" : 1 } 

// 24 hour summary 'Hello' on 2011-4-21 
for(i = 0; i < 24; i++) { 
    //careful: days (1-31), month (0-11) and hours (0-23) 
    stats = db.pagestats.findOne({ page: 'Hello', year: 2011, month: 3, day : 21, hour : i}) 
    if(stats) { 
     print(i + ': ' + stats.views + ' views') 
    } else { 
     print(i + ': no hits') 
    }; 
} 

取決於哪些方面你要跟蹤你可能會考慮增加更多的集合(例如,對於以用戶爲中心的跟蹤收集)。希望有所幫助。

Blogpost about Analytics Data

+0

有趣,你會查找()語法的樣子,如果我想在過去的一天中顯示的每個小時的意見「你好」的計數? – Tom 2011-04-21 06:21:40

+0

..那麼這個解決方案不會是完全理想的。但請繼續,我會發布更新。 – Matt 2011-04-21 07:07:22

+0

與此同時,您可能想看看http://cookbook.mongodb.org/patterns/unique_items_map_reduce/ – Matt 2011-04-21 07:13:54

1

我不會太擔心空間,蒙戈可以擴展在這方面幾乎無限見,加入了更多的空間將是相當便宜。

有一點需要注意的是,如果你保持更新文件的大小將增長,這意味着蒙戈最終需要找到在索引中的一個新的地方。如果你有很多文件正在更新並且規模不斷增加,Mongo需要將這些文件複製到很多地方,這可以大大減緩文件的速度。當然,這一切都取決於你期望的流量。

根據我的經驗,使用簡單的文檔格式,您不需要更新文檔,稍後可能會使查詢複雜化,但您可以使用map/reduce獲取所需的任何信息,而不管您文件結構(給定足夠的經驗你可以做任何事情,地圖縮減非常靈活)。