2017-01-30 15 views
3

MongoDB 3.4コレクションは、ISAMPateフィールドとしてtimesampを含むセンサー情報を格納します。 MongoDBデータを夜間にグループ化する

センサ情報

は、彼らは であるかどうかを別々に処理する必要がどこ 手段> = 20.00(午後8時)と< 08.00(午前8時)。 $hourを使用して、測定値が 日であるかどうかを確認することができます。または です。

夜間のすべての尺度は、夜間の開始日に属します。つまり、21.00の測定日は適合しますが、03.00の測定日から1日を引く必要があります。

夜間対策($matchステップはすべての尺度を除外しますが、それは問題ありません)とその夜の日付別にグループ化したいと思います。私はこれをどのようにすることができるか考えていますか? $projectのステップを使用して時間情報を取得することを考えましたが、グループ操作に使用できる有効な_idを生成する方法がわかりません。

答えて

3

フィルタリング部はまた、$group_idキーとそれに続く$matchパイプラインで使用するフィールドを作成するのに役立つ$addFieldsパイプラインを使用して行うことができます。そのようなバックボーンは、$cond演算子であり、これは、要求の条件を評価して所望の日付を生成する。

単一$redactパイプラインで十分だろうが、あなたもで濾過文書グループにロジックを必要とするので、あなたにも、このようなロジックを持つフィールドを作成する$addFieldsパイプラインを使用する場合があります。

次の例は、この概念を示しています。

db.sensors.aggregate([ 
    { 
     "$addFields": { 
      "yearMonthDay": { 
       "$cond": [ 
        { /* check if date hour is less than 8 */ 
         "$lt": [ 
          { "$hour": "$date" }, 
          8 
         ] 
        }, 
        { /* subtract one day from a measurement at < 08:00 */ 
         "$dateToString": { 
          "format": "%Y-%m-%d", 
          "date": { 
           "$subtract": [ 
            "$date", 
            1000 * 60 * 60 * 24 
           ] 
          } 
         } 
        }, 
        { /* else return actual date */ 
         "$dateToString": { 
          "format": "%Y-%m-%d", 
          "date": "$date" 
         } 
        } 
       ] 
      }, 
      "isNight": { 
       "$or": [ 
        { "$gte": [ { "$hour": "$date" }, 21 ] }, 
        { "$lt": [ { "$hour": "$date" }, 8 ] } 
       ] 
      } 
     } 
    }, 
    { "$match": { "isNight": true } }, 
    { 
     "$group": { 
      "_id": "$yearMonthDay", 
      "count": { "$sum": 1 } 
     } 
    } 
]) 

、より詳細なアプローチは、(@Styvaneのおかげで)次のように$condの代わりに$switchケース式を使用することを含む:

db.sensors.aggregate([ 
    { 
     "$addFields": { 
      "yearMonthDay": { 
       "$switch": { 
        "branches": [ 
         { 
          "case": { "$lt": [ { "$hour": "$date" }, 8 ] }, 
          "then": { /* subtract one day from a measurement at < 08:00 */ 
           "$dateToString": { 
            "format": "%Y-%m-%d", 
            "date": { 
             "$subtract": [ 
              "$date", 
              1000 * 60 * 60 * 24 
             ] 
            } 
           } 
          } 
         }, 
         { 
          "case": { "$gte": [ { "$hour": "$date" }, 8 ] }, 
          "then": { /* return actual date */ 
           "$dateToString": { 
            "format": "%Y-%m-%d", 
            "date": "$date" 
           } 
          } 
         } 
        ] 
       }     
      }, 
      "isNight": { 
       "$or": [ 
        { "$gte": [ { "$hour": "$date" }, 21 ] }, 
        { "$lt": [ { "$hour": "$date" }, 8 ] } 
       ] 
      } 
     } 
    }, 
    { "$match": { "isNight": true } }, 
    { 
     "$group": { 
      "_id": "$yearMonthDay", 
      "count": { "$sum": 1 } 
     } 
    } 
]) 
+0

'$ cond'ウィットを置き換えるのはどうですか? h '$ switch'? – styvane

+0

同じことが実際にはOPがどのように冗長であるかに依存します。それ以外の場合、私は間違っていると私に正しい影響を与えることはないでしょう。 – chridam

+1

あなたは正しいです、私はここでペタンティックにしようとしているわけではありませんが、あなたの意思を明確にし、MongoDB 3.4でこれをやっているのです。 – styvane

関連する問題