1

私のデータベースには3種類のドキュメントがあります:

{
param: "a",
timestamp: "t"
} (Type 1)

{
param: "b",
partof: "a"
} (Type 2)

{
param: "b",
timestamp: "x"
} (Type 3)

(レイアウトを変更できません...;-( )

タイプ 1 は開始タイムスタンプを定義します。これは開始イベントのようなものです。タイプ 1 は、タイプ 2 文書によっていくつかのタイプ 3 文書に接続されています。

最新のタイプ 3 (最も高いタイムスタンプ) と対応するタイプ 1 のドキュメントを取得したいと考えています。

Map/Reduce を整理するにはどうすればよいですか?

4

2 に答える 2

0

ユーザー 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値を使用して提供する必要があります。

于 2011-04-13T19:25:42.800 に答える
0

簡単。リレーショナル データの場合は、リレーショナル データベースを使用します。

于 2011-03-31T04:03:02.350 に答える