2009-06-24 8 views
5

CouchDBで複数の範囲クエリがどのように実装されていますか?単一の範囲条件の場合、startkeyとendkeyの組み合わせは正常に機能しますが、同じことは複数の範囲条件では機能しません。CouchDBは複数の範囲クエリをサポートしていますか?

マイビュー機能は、このようなものです:

"function(doc){ 
     if ((doc['couchrest-type'] == 'Item') 
    && doc['loan_name']&& doc['loan_period']&&  
         doc['loan_amount']) 
    { emit([doc['template_id'], 
      doc['loan_name'],doc['loan_period'], 
      doc['loan_amount']],null);}}" 

が、私はこのようなものですloan_period> 5と loan_amount> 30000マイstartkeyとendkeyパラメータで全体のドキュメントを取得する必要があります:

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{},{},{}],:include_docs => true} 

ここでは、希望の結果が得られません。私のstartkeyとendkeyのパラメータは間違っていると思う。誰でも助けてくれますか?

答えて

0

私のemit文はちょっと奇妙に見えます。 EMITの目的は、キー(つまり、インデックス)、その後、興味のある文書の値を生成することである

例えば:。

emit(doc.index, [doc.name, doc.address, ....]); 

あなたは、インデックスの配列とノーデータを生成していますビューのために。

また、map/reduceパラダイムにはうまく適合しないため、Couchdbはビューの共通部分を提供しません。だからあなたのニーズは、次のようなものに対処しようとしています。

特定の範囲を抽出できるユニークなインデックスを作成できますか? (スタートキー&エンドキーを使用)

4

CouchDBビューは、順序付けられたエントリのリストです。ビューに対するクエリは、そのリストの連続スライスを返します。したがって、2つの不等式条件を適用することはできません。

あなたのloan_periodが離散変数であると仮定すると、このケースはおそらく最初にloan_periodをemitしてから、各期間に1つのクエリを発行することによって最もよく解決されます。

代わりの解決策は、couchdb-luceneを使用することです。

0

実際のCouchDBが問題に与えられた意見は、値の配列である複雑なキーを持つことができます:

[template_id, loan_name, loan_period, loan_amount] 

あなたはあなたは

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0",nil,5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0",{}],:include_docs => true} 

または多分

params = {:startkey =>["7446567e45dc5155353736cb3d6041c0","\u0000",5,30000], 
    :endkey=>["7446567e45dc5155353736cb3d6041c0","\u9999",{}],:include_docs => true} 
1

を試してみました配列をキーとして使用しています。 Couchdbは、2つの要素が等しくないまで、各配列要素を昇順に比較して配列を比較します。

など。 [1,'a',5][1,'c',0]を比較すると、1と1を比較し、次に 'a'と 'c'を比較し[1、 'a'、5]が[1、 'a'、0]より小さいと判断します。

範囲キークエリが失敗する理由を説明します:

["7446567e45dc5155353736cb3d6041c0",nil,5,30000]が大きいです["7446567e45dc5155353736cb3d6041c0",nil,5,90000]

関連する問題