2016-04-07 5 views
1

各文書のタイムスタンプの週までにmongo集約を使用して文書をグループ化しようとしています。すべてのタイムスタンプはUTC時刻で保存されていますので、UTC時刻ではなくクライアント時刻を使用して週を計算する必要があります。夏時間オフセットを使用した集計グループ

以下に示すようにクライアントのUTCオフセットを提供して追加することはできますが、これは夏時間のためにいつもうまくいくとは限りません。オフセットは日付によって異なるため、現在の日付のオフセットを使用してすべてのタイムスタンプを調整することはできません。

夏時間を一貫して考慮している週別にグループ化する方法を知っている人はいますか?

db.collection.aggregate([ 
    { $group: 
     { "_id": 
      { "$week": 
       { "$add": [ "$Timestamp", clientsUtcOffsetInMilliseconds ] } 
      } 
     }, 
     { "firstTimestamp": 
      { "$min": "$Timestamp"} 
     } 
    } 
]); 

答えて

0

ここで基本的な考え方は、特定のクエリの期間、「夏時間」の両方「開始」と「終了」のクエリが「意識」にすると、単純にするために$condにこのテストを提供することです

db.collection.aggregate([ 
    { "$group": { 
     "_id": { 
      "$week": { 
       "$add": [ 
        "$Timestamp", 
        { "$cond": [ 
         { "$and": [ 
          { "$gte": [ 
          { "$dayOfyear": "$Timestamp" }, 
          daylightSavingsStartDay 
          ]}, 
          { "$lt": [ 
          { "$dayOfYear": "$Timestamp" }, 
          daylightSavingsEndDay 
          ]} 
         ]}, 
         daylightSavingsOffset, 
         normalOffset 
        ]} 
       ] 
      } 
     }, 
     "min": { "$min": "$Timestamp" } 
    }} 
]) 

これは、数年をカバーするときに少し複雑にすることができますが、それでも基本的な原則です。南半球では、は常にになりますので、各条件は「開始」から「終了」、「開始」から「終了」の「範囲」になります。したがって、$orの内線番号$andが "範囲"演算子内で実証されています。

異なる値を適用する場合は、いずれかを選択する必要があるときに検出し、$condを使用して適用します。

関連する問題