2016-08-25 26 views
1

私は、複数のデバイスから入ってきたメジャーのコレクションを含むクラウドデータベースを持っています。 各デバイスは多くの測定値を送信しますが、温度、緯度、経度の3つが重要です。 によりシステムの設計に、各値は別々の測定値(Iは簡単挿入時の温度、緯度及び経度に参加することができない)であり、データベースに私はのような措置のセットを有する:couchdb/cloudant時系列クエリ

{ 
    "device": "foo", 
    "name": "temperature", 
    "date": <timestamp>, 
    "value": <value> 
}, 
{ 
    "device": "foo", 
    "name": "latitude", 
    "date": <timestamp>, 
    "value": <value> 
}, 
{ 
    "device": "foo", 
    "name": "longitude", 
    "date": <timestamp>, 
    "value": <value> 
}, 

だから概念的には、私は3つの時系列を持っています。 これらの時系列それぞれの最新のの数値を抽出したいと思います。理想的にはそれらをデバイスでグループ化してください。以下のような

何か:私はこの正確な構文を期待していない

{ 
    device1: { 
    "temperature": { 
     date: <date>, 
     value: <value> 
    }, 
    "latitude": { 
     date: <date>, 
     value: <value> 
    }, 
    "longitude": { 
     date: <date>, 
     value: <value> 
    } 
    }, 
    "device2": { 
    ... 
    } 
} 

、それは私が期待していたデータのセットの単なるアイデアです。

私は位置測定に一緒に参加することができますが、質問は同じです:どのように一緒にグループ化された各デバイスの最後のTSエントリを取得するのですか?最初の場所で

+0

* last ts *は最後のタイムスタンプを表しますか? –

+0

いいえ、私は最終的にtimeserieの日付を記入しました(これは多かれ少なかれ同じです) – joel

+0

あなたの問題に答える前に最後の質問です。各メッシュの "日付"の項目は、 1つのエントリ?それはすべきではない:{ "_id": "123909012"、 "デバイス1":{ "緯度": ""、 "経度": ""、 "温度": "" }、 "デバイス2" :{ 『緯度』: 『』、 『経度』: 『』、 『温度』: 『』 } } –

答えて

1

、私はこのようなデータ構造を使用する:

{ 
    "type":"temperature", 
    "date":"1472528116698", 
    "value":"35", 
    "device":"device1" 
} 

型性のいずれかの温度、緯度、経度とすることができます。

次に、いくつかのビューが必要です。個人的には、私はタイプで1つの_design文書を持つことを好みます。また、クエリの方が簡単です。

{ 
    "_id": "_design/temperature", 
    "_rev": "8-91e594df623063ed3ad7111cde09eecb", 
    "language": "javascript", 
    "views": { 
     "byDevice": { 
      "map": "function(doc) {\n if ((doc.type + '').toLowerCase() === 'temperature' && doc.device)\n  emit(doc.device);\n}\n" 
     }, 
     "lastestByDevice": { 
      "map": "function(doc) {\n if ((doc.type + '').toLowerCase() === 'temperature' && doc.device && doc.value)\n  emit(doc.device,doc.value);\n}\n", 
      "reduce": "function(keys, values, rereduce) {\n var max = Number.MIN_VALUE;\n for (var i = 0; i < values.length; i++) {\n  var val = parseFloat(values[i]);\n  if (val > max)\n   max = val;\n }\n return max;\n}\n" 
     } 
    } 
} 

リクエスト例:

はたとえば、温度のために、このような_design文書を持っているでしょう

http://localhost:5984/db/_design/temperature/_view/latestByDevice?group_level=1&reduce=true

あなたが持つデバイスによる最新のを使用している場合reduce関数では、各デバイスを最大値で返します。この例では、良いスタートを得ることができるはずです。私はあなたのデータをどのように受け取ってビルドするのかはわかりませんが、デバイスごとにすべてをグループ化したい場合は、それも可能です。

+0

に異なるかもしれません「最新の尺度を保持する」関数としてreduce関数を実装することです。 しかし、reduce関数を実装するのは "疑問のある"練習と考えられていますが、私はそれをする必要のない解決策があることを望んでいました – joel

+0

関数を減らさずにビューを使うのは不幸なことですが、ストリングとして貯蔵された。だから、キーをソートする時間が来たら、これはうまくいくのではないかと思うが、今夜は試してみることができる。 –