6

結合ビューを作成するための一般的なトリックと思われるものを使用しています。

// a Customer has many Orders; show them together in one view:
function(doc) {
  if (doc.Type == "customer") {
    emit([doc._id, 0], doc);
  } else if (doc.Type == "order") {
    emit([doc.customer_id, 1], doc);
  }
}

次のクエリを使用して、関連する単一の scustomerとすべての sを取得できることを知っています。Order

?startkey=["some_customer_id"]&endkey=["some_customer_id", 2]

しかし今では、クエリをビュー コードに非常に密接に結びつけることができました。「すべてをこの顧客に結び付け2たい」とより明確に言うために、「 」を置く場所に置くことができる値はありますか? 見たことがあると思います

?startkey=["some_customer_id"]&endkey=["some_customer_id", {}]

しかし、それが他のすべての後に確実にソートされるかどうか{}はわかりません。

join メソッドについてはcmlenzの功績によるものです。

collat​​ion に関する CouchDB wiki ページからのさらなる説明:

このクエリは、 andstartkey=["foo"]&endkey=["foo",{}]など、最初の要素が「foo」であるほとんどの配列キーと一致します。ただし、一致しません["foo","bar"]["foo",["bar","baz"]]["foo",{"an":"object"}]

ソート順{}遅いですが、間違いなく最後ではありません。

4

5 に答える 5

2

私には2つの考えがあります。

タイムスタンプを使用する

照合動作に単純な 0 と 1 を使用する代わりに、レコードが作成されたタイムスタンプを使用します (それらがレコードの一部であると仮定します) a la [doc._id, doc.created_at]。次に、十分に早い日付の開始キー (エポックはおそらく機能します) と「今」の終了キーを使用してビューをクエリできますdate +%s。そのキー範囲には常にすべてが含まれている必要があり、日付で照合するという追加の利点があります。これはおそらくあなたが望むものです.

または、気にしないでください

customer_id だけでインデックスを付けることができ、それ以上のものは何もありません。これには、を使用してクエリを実行できるという優れた利点がありますkey=<customer_id>。確かに、レコードが戻ってきたときに照合されることはありませんが、それはあなたのアプリケーションの問題ですか? 大量のレコードが返されることを期待していない限り、アプリケーションによってデータが取得されたら、リストから顧客レコードを単純に取り出すのは簡単なことでしょう。

たとえば、ルビーでは次のようになります。

customer_records = records.delete_if { |record| record.type == "customer" }

とにかく、タイムスタンプはおそらくあなたのケースにとってより魅力的な答えです。

于 2009-11-10T18:45:24.903 に答える
1

配列キーの2 番目の要素の可能な最大値を見つけようとするのではなく、最初の:よりも大きい可能性のある最小値を見つけようとすることをお勧めします。?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false

于 2010-10-05T03:31:29.067 に答える
0

これでうまくいくはずです:

?startkey=["some_customer_id"]&endkey=["some_customer_id", "\uFFFF"]

これには、\uFFFF 未満の文字 (すべての Unicode 文字) で始まるすべての文字を含める必要があります。

于 2009-11-10T10:41:19.467 に答える
0

CouchDB はほとんどが Erlang で書かれています。システムリソース以外の文字列複合/複合キータプルサイズに上限があるとは思いません(たとえば、使用可能なすべてのメモリを使用するほど長いキー)。CouchDB サイトによると、CouchDB のスケーラビリティーの限界は不明です。巨大な複合主キーにフィールドを追加し続けることができると思いますが、停止する唯一のものは、システムリソースまたはターゲットアーキテクチャの最大整数サイズなどのハード制限です。

CouchDB は JSON を使用してすべてを格納するため、おそらく ECMAScript 標準によって最大の数値に制限されます。JavaScript のすべての数値は、浮動小数点 IEEE 754 double として格納されます。64 ビット double は - 5e-324 から +1.7976931348623157e+308 までの値を表すことができると思います。

于 2009-07-25T03:54:30.670 に答える
0

endKey を排他的ではなく包括的にできる機能があればいいと思います。

于 2009-10-30T09:30:01.180 に答える