質問

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

// 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);
  }
}

次のクエリを使用して単一のデータを取得できることはわかっています。 customer そして関連するすべての Orders:

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

しかし今、私はクエリを結びつけました とても 私のビューコードに近いです。「」を入れる場所に値を入れることはできますか?2「より明確に言うには、「私は欲しいです」 すべて この顧客に関連付けられていますか?」見たことあると思う

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

でもそれはわかりません {}ある 分類する ほかのすべて。

クレジット: センチメートル 結合方法については。

からのさらなる説明 照合順序に関する CouchDB wiki ページ:

クエリ startkey=["foo"]&endkey=["foo",{}] 最初の要素に「foo」が含まれるほとんどの配列キーに一致します。たとえば、 ["foo","bar"] そして ["foo",["bar","baz"]]. 。ただし一致しません ["foo",{"an":"object"}]

それで {}遅い ソート順ではありますが、絶対にそうではありません 最後.

役に立ちましたか?

解決

見つけようとするのではなく、 最高の の可能な値 2番 配列キー内の要素がある場合は、代わりに、 少しでも より大きい値が考えられます 初め: ?startkey=["some_customer_id"]&endkey=["some_customer_id\u0000"]&inclusive_end=false.

他のヒント

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

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

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

または、心配しないでください

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

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

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

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

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

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

endKey を排他的ではなく包含できる機能があれば良さそうです。

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

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

これには、\uFFFF より小さい文字で始まるもの (すべての Unicode 文字) が含まれる必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top