2014-09-05 98 views
1

我正在使用MongoDB聚合框架來聚合一組記錄。MongoDB今天的聚合記錄

相關的代碼片段是:

Record._get_collection().aggregate([ 
     { "$match": { 
      "system_id": system.id 
     }}, 
... 

如何轉變這總記錄今天只有

一個Record文檔具有utc_timestamp場,所以我認爲這會是這樣的:

Record._get_collection().aggregate([ 
     { "$match": { 
      "system_id": system.id, 
      { "$dayOfMonth": "$utc_timestamp" }: 5 
     }}, 
... 

這是正確的嗎?

+0

utc_timestamp字段的格式是什麼? – 2014-09-06 01:15:40

回答

2

爲了剛剛獲得當天的記錄,您仍然基本上需要傳遞一個日期範圍,表示一天的開始時間和範圍的結束時間。假設你已經在你的班上有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日期類型,因爲這是最好的支持形式。