2010-02-18 63 views
3

我從Web服務收集一些統計信息,並將其存儲在集合中。數據看起來與此類似(但更多的字段):

{"downloads": 30, "dt": "2010-02-17T16:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T17:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T18:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T19:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-17T20:56:34.163000"} 
{…} 
{"downloads": 30, "dt": "2010-02-18T17:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T18:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T19:56:34.163000"} 
{"downloads": 30, "dt": "2010-02-18T20:56:34.163000"} 

如果有人要求每天號碼最近三十天內,這將意味着的最高金額(在這個例子中)「下載」公關。天。這是當天的最後紀錄。

通過使用collection.find({"dt": {"$gt": datetime_obj_30_days_ago}}),我當然得到所有的行,這是不是很合適。所以我正在尋找一種方法,只返回給定時期的最後一天。

有人告訴我group()可能是要走的路,但我不太明白如何在這種情況下工作。

任何提示,指針將非常感激!

回答

1

您可以使用group來做到這一點。在你的例子中,你需要提供一個javascript函數來計算關鍵字(以及reduce函數),因爲你只需要日期時間字段的日期組件。這應該工作:

db.coll.group(
    key='function(doc) { return {"dt": doc.dt.toDateString()} }', 
    condition={'dt': {'$gt': datetime_obj_30_days_ago}}, 
    initial={'downloads': 0}, 
    reduce='function(curr, prev) { prev.downloads = Math.max(curr.downloads, prev.downloads) }' 
) 

請記住,仍然沒有過去一個月的線性掃描,就在服務器上而不是在客戶端上。這是可能,簡單地選擇每一天的最大值單獨更快。

+0

非常感謝,科迪 - 你剛剛擴大了我對「組」的理解。 :-) – 2010-02-20 13:19:57