Search:

Search all manuals
Search this manual
Manual
Couchbase Server マニュアル 2.0
Community Wiki and Resources
Couchbase Server 2.0をダウンロード
Couchbase 開発者ガイド 2.0
クライアントライブラリ
Couchbase Server フォーラム
Additional Resources
Community Wiki
Community Forums
Couchbase SDKs
Parent Section
9.8 ビューへのクエリ
Chapter Sections
Chapters

9.8.2. 情報の選択

9.8.2.1. キーまたは複数のキーによる複合情報の選択
9.8.2.2. 部分的な選択とキー範囲
9.8.2.3. 複合キーを使用しての部分的な選択

Couchbase Serverは、ビューによって戻される情報を選択するための様々なメカニズムをサポートしています。(reduce機能を含む)ビューの結果が実行された後、そしてビューの出力に含まれるアイテムがソートされた後に、キーの選択が行われます。

重要

選択メカニズムにキーを指定するときは、キーはJSON値の形式で表現しなければなりません。 たとえば、単一のキーを指定するときに、文字列を引用符で囲む("string")必要があります。

パラメータを介してキーの選択を指定するときは、キーは、ビューによって出力されたキーの形式と一致する必要があります。複合キー、たとえば配列やハッシュが出力されるキー構造で使用されているようなところでは、指定する選択値も配列やハッシュでなければなりません。

次の選択タイプがサポートされています:

9.8.2.1. キーまたは複数のキーによる複合情報の選択

ビュー内で複合キーを生成している場合、たとえば、年、月、日の要素に個々に分割した日付を出力するとき、選択値は複合キーのフォーマットとサイズと正確に一致しなければなりません。keyもしくはkeysの値は、出力するキーの構造と正確に一致しなければなりません。

たとえば、次のビューデータを使用した場合:

JSON
{"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]

これは、指定された日付の指定された範囲内のすべてのレコードを出力します。詳細については、「複合キーを使用しての部分的な選択」を参照してください。

9.8.2.2. 部分的な選択とキー範囲

キーの値と一致には、キーの値の右から左、そして指定された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"よりも結果として辞書的に大きいと、出力を停止します。

要するに、この方法で指定された範囲は、特定の接頭辞に一致する出力をするので、すべてのデータの接頭辞のように動作します。

9.8.2.3. 複合キーを使用しての部分的な選択

配列やハッシュのような複合キーもビューの出力を指定することができ、マッチングの優先順位によって複雑な選択範囲が提供されます。たとえば、時間のデータが次の形式で出力された場合:

[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]

柔軟な構造とstartkeyendkeyの値の特性により、様々な範囲の指定で選択することができます。たとえば、次のように使用することで、今年初めから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までのすべての値を代わりに出力します。

このデータの形式や問い合わせの詳細や例については、「日付と時刻の選択」を参照してください。