0

次のように、時間と分のコレクションに事前に集計されて保存されているメトリックのコレクションがいくつかあります。

"_id" : "12345CHA-2RU020130104",
"metadata" : {
                "adaptor_id" : "CHA-2RU",
                "processor_id" : NumberLong(0),
                "date" : ISODate("2013-01-04T00:00:00Z"),
                "processor_type" : "CHP",
                "array_serial" : NumberLong(12345)
        },
"hour" : {
            "11" : 4.6665907,
            "21" : 5.9431519999999995,
            "7" : 0.6405864,
            "17" : 4.712744,
        ---etc---
    },  
"minute" : {
            "11" : {
                "33" : 4.689972,
                "32" : 4.7190895,
            ---etc---                        
                },
            "3" : {
                "45" : 5.6883,
                "59" : 4.792,
            ---etc---
            }

分のコレクションには、各時間のサブドキュメントがあり、その分のメトリックの値を含む各分のエントリがあります。

私の質問は、集計フレームワークに関するものです。メトリックが特定のハイウォーター マークを上回った分をすべて見つけたい場合、このコレクションをどのように処理すればよいですか? 集計フレームワークを調査すると $unwind 関数が表示されますが、それは配列でのみ機能するようです..

マップ/リデュース機能はこれにより適していますか? これにより、ハイウォーターマークを超えるエントリを発行してカウントすることができました。

4

1 に答える 1

0

オブジェクトの属性を反復処理する reduce 関数を使用して、「キー」の配列を作成できます。

 reduce: function(obj,prev)
 {
    for(var key in obj.minute) {
        prev.results.push( { hour:key, minutes: obj.minute[key]});
    }
 }

あなたに何かを与えるでしょう

  {
          "results" : [
                  {
                          "hour" : "11",
                          "minutes" : {
                                  "33" : 4.689972,
                                  "32" : 4.7190895
                          }
                  },
                  {
                          "hour" : "3",
                          "minutes" : {
                                  "45" : 5.6883,
                                  "59" : 4.792
                          }
                  }
          ]
  }

group() を使用して簡単なテストを行ったところです。サブサブドキュメント (分) を反復処理するには、より複雑なものが必要ですが、うまくいけば正しい方向に向けることができます。

db.yourcoll.group( {
initial: { results: [] }, reduce: function(obj,prev) { for(var key in obj.minute) { prev.results.push( { hour:key, minutes: obj.minute[key]}); } } } );

ファイナライザーでは、データを再度整形することができます。分と時間のデータをドキュメントの要素ではなく配列として保持する方が簡単かもしれません。

それが少し役立つことを願っています

于 2013-01-30T00:13:53.413 に答える