爲了剛剛獲得當天的記錄,您仍然基本上需要傳遞一個日期範圍,表示一天的開始時間和範圍的結束時間。假設你已經在你的班上有DateTimeField隨後的MongoDB將使用BSON date類型,是與日匯聚運營商兼容實現這一點:
Record._get_collection().Aggregate([
{ "$match": {
"system_id": system.id,
"utc_timestamp": {
"$gte": datetime.datetime(2014,9,6)
"$lt": datetime.datetime(2014,9,7)
}
}},
{ "$group": {
"_id": { "$dayOfYear": "$utc_timestamp" }
....
在$group
一級,這些運營商在彙總值時,通常最有意義比一天更寬的範圍,或者在一天內以小時或分鐘爲單位。否則,由於日期已被選中,因此所有內容都是當天,任何其他字段或值的聚合鍵實際上都是在當天彙總的。
相反,如果由「時間戳」你確實有代表紀元以來的秒數(BSON類型實際上在內部使用紀元以來的毫秒數),那麼你可以構建您的查詢是這樣的:
Record._get_collection().Aggregate([
{ "$match": {
"system_id": system.id,
"utc_timestamp": {
"$gte": (datetime.datetime(2014,9,6)
- datetime.datetime(1970,1,1)).total_seconds()
"$lt": (datetime.datetime(2014,9,7)
- datetime.datetime(1970,1,1)).total_seconds()
}
}},
{ "$group": {
"_id": {
"$subtract": [
"$utc_timestamp",
{ "$mod": [
"$utc_timestamp",
60 * 60 * 24
]}
]
},
...
或類似的通過乘以1000來調整更爲通用的歷元時間戳格式的毫秒。對於通過將匹配的時間戳值四捨五入到當前日期來應用標準「日期數學」的分組。
最後,MongoEngine支持ComplexDateTimeField,它保留了python datetime對象通常可用的微秒數。有點不幸的是,在這種情況下,MongoDB中的實際存儲是一個「字符串」,因此數學或一般日期操作符都不可用。但是字符串被格式化爲YYYY,MM,DD,HH,MM,SS,NNNNNN
,這至少是「詞彙」排序,因此可以範圍內選擇,並用$substr
解剖以聚集以每天,或其它週期:
Record._get_collection().Aggregate([
{ "$match": {
"system_id": system.id,
"utc_timestamp": {
"$gte": "2014,09,06", "$lt": "2014,09,07"
}
}},
{ "$group": {
"_id": { "$substr": [ "$utc_timestamp", 0, 10 ] }
...
但是,如果使用的是任何其他形式的字符串,那麼你將有問題,因爲它不可能很好地轉換爲查詢匹配或分組鍵選擇。在這種情況下,您最好將任何此類字符串轉換爲使用上述表單之一,並明顯偏好使用本機BSON日期類型,因爲這是最好的支持形式。
utc_timestamp字段的格式是什麼? – 2014-09-06 01:15:40