map関数はビューの最も重要な部分で、Couchbaseに保存された個々のオブジェクトの入力フィールドと、ビューにアクセスした際の出力情報の論理的なマッピングを提供します。
このマッピングプロセスを通じて、map関数とビューは次を提供します:
バケットに対するビューの構造と出力フォーマット。
ビュー情報を利用して個々のドキュメントをクエリ、選択するための構造と情報。
ビュー結果のソート。
ビューの内容を要約、reduceするための入力情報
アプリケーションはREST APIやCouchbaseクライアントライブラリを介してビューにアクセスします。全てのクライアントライブラリはビューシステムにクエリをサブミットし、結果を取得して、処理するためのメソッドを提供します。
map関数の基本的な操作は、以下の図で見ることができます。
この例では、map関数がName, City, Salaryといったフィールドを、Couchbaseバケットに保存されたJSONから取得し、これらのフィールドの表にマッピングします。このmap関数は次のようになります:
function(doc, meta) { emit(doc.name, [doc.city, doc.salary]); }
ビューが生成されるとき、map()
関数は格納された各ドキュメントのための2つの引数(doc
とmeta
)を提供します:
doc
Couchbaseバケットに保存されたドキュメントで、JSONまたはバイナリ形式です。コンテンツタイプはmeta
引数オブジェクトのtype
フィールドにアクセスすることによって識別することができます。
meta
保存ドキュメントのメタデータで、有効期限、ドキュメントID、リビジョンなどの情報を含みます。詳細については、「ドキュメントメタデータ」を参照してください。
Couchbaseバケットにあるすべてのドキュメントが順番にmap()
関数にわたされます。ビューが作成された後は、最後の更新の後に作成、変更されたドキュメントのみがビューで処理されます。ビューインデックスと更新はビューがアクセスされたときにマテリアライズされます。最後のビューへのアクセスのあとに追加もしくは変更されたドキュメントは再度map()
関数にわたされるので、ビューは更新され、データバケットの現在の状態が反映されます。
map()
関数の内部では、整形、計算、もしくはその他の詳細な処理をすることができます。ビュー情報を生成するためには、emit()
関数の呼び出しを使用しています。emit()
関数を呼び出すたびに、生成されたビューの内容にひとつの行もしくはレコードが出力されます。
emit()
関数は生成されたビューの各レコードとして2つの引数、keyとvalueを受け入れます。
key
出力するキーは、データベース内のコンテンツをソート、およびクエリするためにCouchbase Serverによって利用されます。
キーは、文字列や複合型(配列やJSONオブジェクト)など、任意の形式とすることができます。出力したキーの構造によってビュー内の情報を選択するため、キーの内容と構造は重要です。
全てのビューはキーの内容と構造によってソートされた順序で出力されます。キーが数値の場合、数値としてソートされ、文字列の場合はUTF-8が利用されます。配列やハッシュといった複合型もキーとしてサポートされます。ソートアルゴリズムとシーケンスについての詳細は、「ソート」を参照してください。
キーの内容は、このソート処理のほかに、完全一致、あるいはキーの範囲としてクエリに利用されます。たとえば、キーとして、RECIPE TITLE
フィールドをビューが出力した場合、’Lasagne’(ラザニア)にマッチしたキーのみを返すように指定することによって、’Lasagne’にマッチしたすべてのレコードを得られます。
キーとバリューを利用して情報をクエリしたり抽出する方法の詳細については、「ビューへのクエリ」を参照してください。
value
値は各ビューの行に出力したい情報です。静的なデータ、JSONオブジェクトのフィールド、計算した値やJSONオブジェクトを元にした文字列など、いかなる値も利用できます。
値の内容はreduce処理に利用されるため、reduceを実行する場合、特に組み込みのreduce関数を利用する場合は重要になります。たとえば、売上データを出力するときは、出力するキーをSALESMAN
として、valueを売上高とします。ビルトイン_sum
関数は一意の各keyに対応するvalueの内容を合計します。
キーと値の形式は、あなた次第です。これらを単一の値、文字列や、配列やJSONといった複合値としてフォーマットすることができます。ビューの定義で生成したキーと同一の形式でキーを指定する必要があるので、キーの構造は重要です。
emit()
は、1回のmap関数で何回も呼び出すことができ、各呼び出しは生成されたビューの1行を出力します。データベース内の複合フィールドをベースにした情報に対するクエリをサポートしたい場合に便利です。ビューの定義と選択基準の例については、「複数行の出力」を参照してください。
ビューとマップの生成は非常に寛容です。入力JSONオブジェクト内に存在しないフィールドを出力することを選択する場合、null
値で単純に置き換えられ、エラーは生成しません。
例えば、以下のビューでは、いくつかの入力レコードはビューで指定された全てのフィールドを含んでいません。ビューの結果の中には、value出力のフィールドにただのnull
のエントリが表示されます。
入力データ内に該当のフィールドが存在するか、map処理内で行を出力する前にチェックするべきでしょう。
異なるタイプの情報を出力し、それを取得するために、map関数がどのように動作するのか、より良く理解するには、「ビューとクエリのパターンの例 」を参照してください。