2011-01-26 13 views
4

私はそれぞれがプレフィックスフィールドを持つドキュメントを格納するCouchdbを持っています。しかし、長いキーを使用して、私は適切な文書(接頭辞で、常に1つの完全試合)を取得するこれらの文書を照会する必要がcouchdbクエリで「部分一致」を実装する方法


_id=1 {prefix="AAABBBCCC", ...} 
_id=2 {prefix="AAABBBDDD", ...} 
_id=3 {prefix="AAABBE", ...} 
_id=4 {prefix="AAAFF", ...} 

:プレフィックスがユニークであるので、彼らは実際のID

言うように使用することができます完全に接頭辞に一致します。プレフィックスの長さは変化し、キーの長さは一定です。


query_key = AAABBBCCC123 => _id1 
query_key = AAABBBDDD456 => _id2 
query_key = AAABBEEEEEEE => _id3 
query_key = AAABxxxxxxxx => Null 

これはどのようにしてCouchで行うことができますか?

+0

'AAABBBCCC'と' AAABBBCCC12'の両方があり、 'AAABBBCCC123'を問い合わせるとどうなりますか?どちらが正しい答えですか?それとも、その状況は不可能ですか? – JasonSmith

答えて

2

doc.prefixを放出するビューを作成します。このよう

。クエリstartkeyのクエリをlimit=1と設定してクエリします。結果のプレフィックスとなるかもしれませんが、確認する必要があります。

クライアントでプレフィックスを確認することも、_list機能でプレフィックスを確認することもできます。 A _list関数はおそらくパフォーマンスには役に立たないので、クライアントではを実行することを検討します。多くの言語で多くのクライアントがあり、同じ出力でクエリするために単一のURLで標準化できます。

+0

ああ、私はちょうど同じテクニックであなたのコメントを見ました。ごめんなさい。 – JasonSmith

+0

私はあなたにポイントを与えるでしょう - _listについて知りませんでした、ありがとう! – tbikeev

0

マップ機能は、この

function(doc) { 
    emit(doc.prefix, doc); 
} 

ようになっているはずです、あなたがキーにsubstring関数を使用してドキュメントを検索する必要があります。

_design/doc/_view/viewname?key=QUERY_KEY.substring(0, FIXED_KEY_LENGTH) 
+0

サブストリングについてわからないFIXED_KEY_LENGTHは事前にわかりません.../view/QUERY_NAME/startkey = "query_key"&descending = true&limit = 1これは私に最後の接頭辞を与えますプレフィックスが実際にquery_keyに含まれているかどうかを検証する必要があります(クライアント側ではその時点で確認されています)。 – tbikeev

関連する問題