ユーザー jhs が私の前に述べたように、データはリレーショナルであり、変更できない場合は、CouchDB の使用を再検討することをお勧めします。
リレーショナルとは、データ内の各「タイプ 1」または「タイプ 3」ドキュメントがそれ自体についてのみ「認識」し、「タイプ 2」ドキュメントは他のタイプのドキュメント間の関係についての知識を保持することを意味します。CouchDB では、ドキュメント自体のフィールドによってのみインデックスを作成でき、includedocs=true
. したがって、要求されたデータの一部が要求されたドキュメントから 2 レベル離れているため、単一の CouchDB クエリでは要求したことを達成できません。
2 つのクエリ ソリューションを次に示します。
{
"views": {
"param-by-timestamp": {
"map": "function(doc) { if (doc.timestamp) emit(doc.timestamp, [doc.timestamp, doc.param]); }",
"reduce": "function(keys, values) { return values.reduce(function(p, c) { return c[0] > p[0] ? c : p }) }"
},
"partof-by-param": {
"map": "function(doc) { if (doc.partof) emit(doc.param, doc.partof); }"
}
}
}
最初に でクエリを実行して でparam-by-timestamp?reduce=true
最新のタイムスタンプを取得し、 でvalue[0]
対応するパラメータを取得してからvalue[1]
、 で再度クエリを実行しますpartof-by-param?key="<what you got in previous query>"
。タイムスタンプとパラメーターと一緒に完全なドキュメントを取得する必要がある場合はincludedocs=true
、正しい_doc
値を使用して提供する必要があります。