ビューの基本は単純です。ビューはCouchbaseバケットに保存されたデータに対して、データベース内のデータ内容をもとに、情報を定義し、フィルタして、検索やクエリを提供する、データを特別な方法で表現する形式の切り口を作成します。ビュー作成のプロセスでは、アウトプットの構造、フィールドの順序、内容や任意のサマリやグルーピングの情報を定義します。
ビューを作成するには、保存されたJSONオブジェクトデータをJSON配列やオブジェクトに変換し、キーとバリューの二つのコンポーネントとして、アウトプットの構造を定義します。この定義は二つの独立したJavaScriptで記述した関数の仕様として実行されます。ビューの定義は、map関数とreduce関数の二つのパーツに分かれています:
Map関数
名前が示すように、map関数は入力データ(データベースに保存されたJSONオブジェクト)とビューの結果(出力)に表示したいデータとの間のマッピングを作成します。ビューのためのCouchbaseバケット内のすべてのドキュメントは各ビューでmap()
関数に提供され、ビューの結果として利用されるmap()
関数からの出力となります。
map()
関数はビュープロセッサによって2つの引数が提供されます。第一引数はJSONドキュメントデータです。オプションの第二引数は、ドキュメントに関するメタデータで、有効期限、フラグやバージョン情報などです。
map関数はemit()
関数を使用して0もしくは0以上の行を出力します。emit()
関数の各呼び出しはビューの結果にあるデータの行と同じになります。 emit()
関数は1回のmap()
関数の処理の中で何回も呼び出すことが可能です。この機能によって、単一のJSONレコード内に結合されて保存された情報を公開するビューを作成することができます。
以下の図を参照してください。保存されたJSONドキュメントのname、salary、cityフィールドを、ビューの内容で表(フィールドの配列)に変換しています。
Reduce関数
reduce関数はmapフェーズで生成された内容を要約するために利用します。ビューのreduce関数はオプションで、必ずしも定義する必要はありません。reduce関数が定義されているとき、(対応するmap()関数
で呼び出される各emit()
からの)出力の各行は対応するreduce()
関数によって処理されます。
ビューでreduce関数を定義すると、自動的に利用されます。ビューにアクセスするとき、reductionを無効化すること(reduce=false
)によってreduce関数を有効化せずにビューにアクセスすることができます。
reduce関数の典型的な利用例は、入力データのカウントを生成したり、合計といった入力データに対する計算を行うことです。例えば、入力データが従業員と給与を含んでいる場合、特定のロケーション内の人々のカウントをとったり、特定のロケーション内の人々の給与の合計を計算するために、reduce関数を利用することができます。
mapとreduce関数の組み合わせがビューを生成します。map関数が各JSONドキュメントをベースに初期のマテリアルを生成し、reduce関数がmapフェーズで生成された情報を要約して、この二つの関数が働き合っています。reduce処理の実行はビューをアクセスする際に選択可能で、コンテンツをreduceするかどうかを選択できます。また、キーの配列を指定して、グループ化されたreduceの情報を指定することもできます。
ビュー出力の各行はビューのキーとバリューで構成されています。map関数のみを利用してビューにアクセスする場合、ビューのキーとバリューの内容は、ビューの定義で明示した情報です。このモードでは、ビューは常にid
フィールドを含み、このフィールドは元の記録のドキュメントIDを含みます。(つまり、オリジナルのデータレコードを保存するときにIDとして使用していた文字列)
mapとreduce関数の双方を有効にしてビューにアクセスすると、入力で指定したキーとグループレベルに応じたreduce関数結果のキーとバリューが返却されます。複数のレコードがひとつにマージされている場合、reduceされたデータではドキュメントIDが特定できないので、ドキュメントIDは自動的には結果に含まれません。さまざまな明示的あるいは暗黙的な値の例は、二つの関数の詳細として説明されています。
ビュー作成の処理例は下図を参照してください。
二つの要素は分離されているので、それぞれの関数を個別に検討できます。
map関数の書き方と、map関数の出力がどのように影響を及ぼし、検索をサポートするかについては、「Map関数」を参照してください。reduce関数の書き方の詳細については、「reduce関数」を参照してください。
ビュー名は、1つまたは複数のUTF-8文字を使用して指定する必要があります。空白ビュー名は使用できません。ビュー名の先頭または末尾に空白文字(スペース、タブ、改行、キャリッジリターン)を使用できません。
ビューを作成するために、管理コンソールのビューエディタ(「ビューエディタの利用」を参照)か、デザインドキュメントのためのREST API(「デザインドキュメントのREST API」を参照)、もしくはビュー管理をサポートするクライアントライブラリのひとつを使用することができます。
詳細な情報および、問い合わせとmapからの情報の取得の仕方については、「ビューへのクエリ」を参照してください。