私はしばらくの間、これを理解しようとしてきました.SOの質問をたくさん読んだり、ドキュメントを調べたりしましたが、役に立ちませんでした. ここの誰かが私を正しい方向に向けてくれることを願っています!
次のドキュメントを検討してください。
{
"_id": "045bdeb40176b33cf07b21cd1fb3949e",
"type": "test_result",
"customer_id": "customer",
"product_id": "product1",
"type_id": "type",
"version_id": "1.0.0",
"timestamp": 1381505909000,
"test_result": "passed",
"serial_nr": "NEP000001"
}
{
"_id": "045bdeb40176b33cf07b21cd1fb3c434",
"type": "measurement_result",
"test_result_id": "045bdeb40176b33cf07b21cd1fb3949e",
"measurement_id": "customer:product1:type:1.0.0:0",
"timestamp": 1381505909000,
"data": 2.5
}
アプリケーションには、さまざまな方法で測定された単位のデータが含まれています。test_result
ユニットがテストされるたびに、1 つのドキュメントが挿入されます。各ユニットには固有のserial_nr
. ユニットで行われる測定ごとに1 つのmeasurement_result
ドキュメントが挿入されます (通常、ユニットごとに約 50 の測定)。その単位の各測定値には固有の がありmeasurement_id
ます。結果が挿入されると、timestamp
が生成されます。1 つのユニットを複数回テストできます。
私が構築しようとしているビューは次のとおりです。
- ユニットが初めてテストされたすべてのデータを取得します。
- ユニットがテストされた最新の時間のすべてのデータを取得します。
- 1 つの のすべての測定値を取得します
measurement_id
が、最も古い結果のみを取得します。1 つのユニットが複数回テストされている場合は、最初のテストの測定結果のみを含める必要があります。 - 1 つの のすべての測定値を取得します
measurement_id
が、最新の結果のみを取得します (最も古い結果と同じルール)。
目標は、 、、などのdata
統計を計算するフィールドを減らすことです。ユニットがテストされた最初/最新の時間で統計を分離できることは非常に重要です。average
min
max
standard deviation
複雑なキー、非常に高度な削減、および他の多くのアプローチを使用しようとしましたが、最新/最新の結果を分離できないようです。
このアプリケーションはまだ実稼働にはほど遠いので、どんな解決策も歓迎します (データベース システムを切り替えることもあると思います)。他の方法でデータを構造化する必要がありますか? これは可能ですか?長期的には大量のデータが得られるため、統計を段階的に計算できることが非常に重要です。
この質問は私のものと多かれ少なかれ同じようですが、答えはありませんでした。
更新 #1
ケース #1 と #2 の場合は、おそらく単にマップし[serial_nr, timestamp]
てから reduce_limit をオフにして、最新のエントリのみを返すことができるようにすることができます。それが長期的にパフォーマンスにどのように影響するかわかりませんか?
#3 と #4 の場合、それはより困難です。grouped by を計算するmeasurement_id
必要があるため、キー配列の最初の要素である必要があります。しかし、その後は?
(簡単にするために、measurement_result
ドキュメントにも があると仮定しますserial_nr
)
map:
function(doc) {
if (doc.type == 'measurement_result')
emit([doc.measurement_id, doc.serial_nr, doc.timestamp], doc.data)
}
reduce:
_stats
GET
ここではwithgroup_level=1
が唯一のオプションです。そうしないと、各 Measurement_id に対して個別の結果が得られるためです。ただし、最新または最も古い結果のみを除外することはまだできていません。おそらく、reduce 関数を作成して重複serial_nr
をチェックし、最新/最も古いものだけを返すことができますが、その方法がわかりません。
これで問題が少し解決することを願っています。