2013-02-22 50 views
3

我想知道是否有人能幫我讓我的聚合功能正確。我試圖計算一段文本在特定日期每小時出現的次數。到目前爲止,我已經有了:聚合:每小時計數項目

db.daily_data.aggregate(
    [ 
    { $project : { useragent: 1, datetime: 1, url: 1, hour: {$hour: new Date("$datetime")} } }, 
    { $match : { datetime: {$gte: 1361318400000, $lt: 1361404800000}, useragent: /.*LinkCheck by Siteimprove.*/i } }, 
    { $group : { _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: 1} } } 
    ] 
); 

但我顯然得到它錯了,因爲時間永遠是0:

{ 
    "result" : [ 
    { 
     "_id" : { 
     "useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com", 
     "hour" : 0 
     }, 
     "queriesPerUseragent" : 94215 
    } 
    ], 
    "ok" : 1 
} 

這裏有一個記錄的下調例子太多:

{ 
    "_id" : ObjectId("50fe63c70266a712e8663725"), 
    "useragent" : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.0) LinkCheck by Siteimprove.com", 
    "datetime" : NumberLong("1358848954813"), 
    "url" : "http://www.somewhere.com" 
} 

我也嘗試使用new Date("$datetime").getHours()而不是$hour函數試圖獲得相同的結果,但沒有運氣。有人能指點我走向哪裏嗎?

謝謝!

+1

$ hour函數假定您有ISODate()或Date()格式,並且在agg框架中沒有可用的日期格式轉換(儘管它有一個jira票據)。 – 2013-02-22 10:26:06

回答

3

這是一個建議,而不是您的問題的答案。

在MongoDB進行分析時,建議您爲每個要計算的指標預先聚合您的存儲桶(在您的用例中爲小時桶)。

因此,對於您的指標,您可以更新彙總預收款(加快你的查詢時間):

db.user_agent_hourly.update({url: "your_url", useragent: "your user agent", hour: current_HOUR_of_DAY, date: current_DAY_Date}, {$inc: {counter:1}}, {upsert:true}) 

考慮到,在current_DAY_Date你必須指向穩定的日期值當天,即current_year/current_month/current_day 00:00:00,使用相同的小時:分鐘:秒來接收當天收到的每個指標。

然後,您可以查詢此集合,對於任何給定時間段內提取彙總分析如下:

db.user_agent_hourly.aggregate(
    {$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE}}}, 
    {$group:{ _id : { useragent: "$useragent", hour: "$hour" } ,queriesPerUseragent: {$sum: "$count"} } }, 
    {$sort:{queriesPerUseragent:-1}} 
) 

如果你想使用一個特定的用戶代理篩選結果,您可以使用一個查詢:

db.user_agent_hourly.aggregate(
    {$match:{date:{$gte: INITIAL_DATE, $lt: FINAL_DATE, useragent: "your_user_agent"}}}, 
    {$group:{ _id : { useragent: "$useragent", hour: "$hour" }, queriesPerUseragent: {$sum: "$count"} } } 
) 

PS:我們店的每一個在其他集合收到的度量單位,以便能夠重新處理災難或其他需要的情況下。