Couchbase Serverは、ビューによって戻される情報を選択するための様々なメカニズムをサポートしています。(reduce機能を含む)ビューの結果が実行された後、そしてビューの出力に含まれるアイテムがソートされた後に、キーの選択が行われます。
選択メカニズムにキーを指定するときは、キーはJSON値の形式で表現しなければなりません。 たとえば、単一のキーを指定するときに、文字列を引用符で囲む("string")必要があります。
パラメータを介してキーの選択を指定するときは、キーは、ビューによって出力されたキーの形式と一致する必要があります。複合キー、たとえば配列やハッシュが出力されるキー構造で使用されているようなところでは、指定する選択値も配列やハッシュでなければなりません。
次の選択タイプがサポートされています:
明示的なキー
明示的なキーはパラメータkey
を使用して指定することができます。ビュークエリは、ビュー出力に指定したkey
パラメータにそれぞれ一致したキーとバリューの結果のみ返します。
たとえば、値"tomato"を指定した場合、正確に"tomato"に一致するレコードのみが選択され、返されます。"tomatoes"のような値のキーは返しません。
キーのリスト
出力されるキーのリストをkeys
パラメータを使用して値を配列で提供することで指定できます。この例では、指定した配列内の各アイテムは、ビューの結果のキーと、論理or
で結合された各配列の値とが正確に一致するかというように、使用されます。
たとえば、keys
パラメータに指定する値が["tomato","avocado"]
の場合、'tomato'か'avocado' のキーをもつ結果がすべて返されます。
このクエリオプションを使用する場合、出力結果はキーでソートされていません。これは、これらの値のキーのソート処理が要求された情報を返す前に、すべての行を照合およびソートする必要があるためです。
複合キーを使用しての処理は、それぞれの複合キーをクエリで指定する必要があります。例:
keys=[["tomato",20],["avocado",20]]
キーの範囲
startkey
とendkey
から成るキーの範囲。これらのオプションは、次のように個別に、または一緒に使用することができます:
startkey
のみ
出力はstartkey
が最初に出現するか、もしくは指定された値より大きい値が出るまで開始されません。出力は、そのビューの終わりまで続きます。
endkey
のみ
出力は、最初のビューの結果から始まり、endkey
が最後に出現するか、または出力された値がendkey
の計算された辞書値より大きくなるまで継続します。
startkey
とendkey
値の出力は、startkey
が表れるまで開始されず、最後のendkey
の出現が識別されると停止します。
endkey
を使用するとき、inclusive_end
オプションは指定されたendkey
の最後の出現の後に停止する(デフォルト)かどうかを指定します。falseに設定した場合、出力は、指定されたendkey
が出る前の最後の結果で停止します。
マッチングアルゴリズムは部分一致であり、キーの範囲で検索するときに有利になります。こちらも参照してください。「部分的な選択とキー範囲」
ビュー内で複合キーを生成している場合、たとえば、年、月、日の要素に個々に分割した日付を出力するとき、選択値は複合キーのフォーマットとサイズと正確に一致しなければなりません。key
もしくはkeys
の値は、出力するキーの構造と正確に一致しなければなりません。
たとえば、次のビューデータを使用した場合:
{"total_rows":5693,"rows":[ {"id":"1310653019.12667","key":[2011,7,14,14,16,59],"value":null}, {"id":"1310662045.29534","key":[2011,7,14,16,47,25],"value":null}, {"id":"1310668923.16667","key":[2011,7,14,18,42,3],"value":null}, {"id":"1310675373.9877","key":[2011,7,14,20,29,33],"value":null}, {"id":"1310684917.60772","key":[2011,7,14,23,8,37],"value":null}, {"id":"1310693478.30841","key":[2011,7,15,1,31,18],"value":null}, {"id":"1310694625.02857","key":[2011,7,15,1,50,25],"value":null}, {"id":"1310705375.53361","key":[2011,7,15,4,49,35],"value":null}, {"id":"1310715999.09958","key":[2011,7,15,7,46,39],"value":null}, {"id":"1310716023.73212","key":[2011,7,15,7,47,3],"value":null} ] }
key
選択メカニズムを使用して、次のようにキーの値すべてを指定しなければなりません:
?key=[2011,7,15,7,47,3]
日付のみのような値を指定した場合:
?key=[2011,7,15]
正確なキーの一致がないので、ビューはレコードを返しません。代わりに、出力したい情報の範囲を包含する範囲を使用する必要があります。
?startkey=[2011,7,15,0,0,0]&endkey=[2011,7,15,99,99,99]
これは、指定された日付の指定された範囲内のすべてのレコードを出力します。詳細については、「複合キーを使用しての部分的な選択」を参照してください。
キーの値と一致には、キーの値の右から左、そして指定されたstartkey
と/もしくはendkey
の優先順位を持っています。したがって、部分文字列は、指定され、特定の情報を返すかもしれません。
たとえば、ビューのデータを次のように与えると:
"a", "aa", "bb", "bbb", "c", "cc", "ccc" "dddd"
"aa" の値のstartkey
パラメータを指定すると、"aa"を含んだ最後の7つのレコードを返します:
"aa", "bb", "bbb", "c", "cc", "ccc", "dddd"
startkey
に部分文字列を指定すると、最初の値もしくは指定した値よりも大きな値が識別されるとすぐに、選択した値の出力が開始されます。文字列では、この(左から右への)部分的な一致は識別されます。たとえば、 "d"のstartkey
を指定すると、次のように返されます:
"dddd"
これは、ビューの行からのキーが指定されたstartkey
の左から右への値と一致するとすぐに、最初の一致として識別されるからです。指定された単一の文字は、ビューの出力の最初の文字と一致します。
より大きい文字列との複合値を比較するとき、同じマッチングアルゴリズムが使用されます。たとえば、成分のデータベースの検索に、"almond"のstartkey
を指定すると、"almond"、"almonds"、そして"almond essence"を含んだ成分すべてを返します。
全範囲にわたって与えられた語または値にすべてのレコードを一致させるためには、endkey
パラメータにnull値を使用することができます。たとえば、"almond",という単語で開始するすべてのレコードのみを検索するには、"almond"のstartkey
と"almond\u02ad"(最後の文字は最後という意味のラテン文字)のendkeyを指定します。Unicode文字列を使用する場合、"\uefff"を使用します。
startkey="almond"&endkey="almond\u02ad"
この例での優先順位は、'almond'があると出力を開始し、指定されたendkey
よりも出力されるデータが辞書的に大きいと出力を停止するということを意味します。"almond\02ad"という値をもつレコードがなかった場合でも、出力されるデータが"almond\02ad"よりも結果として辞書的に大きいと、出力を停止します。
要するに、この方法で指定された範囲は、特定の接頭辞に一致する出力をするので、すべてのデータの接頭辞のように動作します。
配列やハッシュのような複合キーもビューの出力を指定することができ、マッチングの優先順位によって複雑な選択範囲が提供されます。たとえば、時間のデータが次の形式で出力された場合:
[year,month,day,hour,minute]
このとき、正確な日付(と時間)の範囲は、生成されたデータの中の日付と時刻を指定することで選択できます。たとえば、2011/04/01 00:00から2011/09/30 23:59の間の情報を取得するには:
?startkey=[2011,4,1,0,0]&endkey=[2011,9,30,23,59]
柔軟な構造とstartkey
とendkey
の値の特性により、様々な範囲の指定で選択することができます。たとえば、次のように使用することで、今年初めから3月5日までのすべてのデータを取得できます:
?startkey=[2011]&endkey=[2011,3,5,23,59]
特定の日付からその月の終りまでのデータを調べることもできます:
?startkey=[2011,3,16]&endkey=[2011,3,99]
上記の例では、配列の日
の要素の値がありえない値ですが、出力される値がendkey
の値よりも辞書的に大きいときをマッチングアリゴリズムは特定し、出力する情報を選択することを停止します。
この構造の制限は、より前の配列の値を無視することができないということです。 たとえば、毎日の10amから2pmまでの情報を選択するために、このパラメータセットを使用することはできません:
?startkey=[null,null,null,10,0]&endkey=[null,null,null,14,0]
さらに、選択は開始と終了のキーに基づいて値の範囲の出力によって作られているので、クエリの日付部分の範囲の値を指定することはできません:
?startkey=[0,0,0,10,0]&endkey=[9999,99,99,14,0]
これは最初の日の10amから最後の日の2pmまでのすべての値を代わりに出力します。
このデータの形式や問い合わせの詳細や例については、「日付と時刻の選択」を参照してください。