1つ以上のビューを持つ新しいデザインドキュメントを作成するには、REST APIを使用して、ビューの定義と、対応するデザインドキュメントを同時にアップロードします。このコマンドの形式は、以下の表に示されています:
| メソッド | PUT /bucket/_design/[デザインドキュメント] |
| リクエストデータ | デザインドキュメント定義(JSON) |
| レスポンスデータ | 成功したかどうかと、格納されたデザインドキュメントID |
| 認証情報の要否 | 任意 |
| リターンコード | |
| 201 | ドキュメントの作成が成功しました |
| 401 | リクエストしたアイテムが指定した認証情報では利用できないか、認証情報が指定されていません |
REST APIを介してデザインドキュメントを作成するとき、開発(dev)のビューを作成することをお勧めします。開発のデザインドキュメントとビューを最初に作成し、そのあとでデザインドキュメントで構成されたビューの出力を確認することをお勧めします。devのビューを作成するには、デザインドキュメントの名前にdev_接頭辞を明示的に使用する必要があります。
たとえば、 curlを使用して、次のコマンドのようにデザインドキュメントの内容に(byfield.ddocという名前の)テキストファイルを作成することによって、デザインドキュメント、byfieldを作成できます:
shell> curl -X PUT -H 'Content-Type: application/json' \ http://user:password@localhost:8092/sales/_design/dev_byfield' \ -d @byfield.ddoc
上記の例では:
-X PUT
HTTP PUTの操作をリクエストすることを示しています。
-H 'Content-Type: application/json'
HTTPヘッダ情報を指定します。Couchbase Serverはapplication/jsonデータ型として送信され、識別される情報を必要とします。このヘッダでコンテンツタイプのセットが提供されていない情報は拒否されます。
http://
user:password@localhost:8092/sales/_design/dev_byfield'
認証情報を含むバケットのURLで、アップロードしたいデザインドキュメントの場所を示します。userとpasswordは、管理者権限か、SASLで保護されたバケットのためのものつまり、バケットの名前とパスワードのどちらかになります。バケットにパスワードが設定されていない場合、認証情報は必要ありません。
このケースでアクセスされているビューは開発ビューです。開発ビューを作成するには、ビューの名前にdev_接頭辞を使用しなければなりません。
PUTコマンドのように、ロケーションがデザインドキュメントの名前として設計されているということからもURLは重要です。例では、URLにバケットの名前(sales)とdev_byfieldで作成されているデザインドキュメントの名前を含んでいます。
-d @byfield.ddoc
データペイロードがファイルbyfield.ddocからロードされるべきであると指定します。
成功した場合、HTTPレスポンスコードは201(作成完了)になります。返されるJSONには、フィールドokと、作成されたデザインドキュメントのIDが含まれます。
{ "ok":true, "id":"_design/dev_byfield" }
システムで作成または更新される前にデザインドキュメントは検証されます。この妥当性検証は、有効なJavascriptのためと、有効なビルトインreduce関数の利用ために実施されます。妥当性検証の失敗はエラーとして報告されます。
エラーのイベントで返されるJSONには、フィールドerrorに短い説明、およびフィールドreasonにより詳細な問題の説明が含まれます。
デザインドキュメントのフォーマットは、デザインドキュメントで定義されたすべてのビューが含まれ、各名前付きビューでmapとreduce関数両方を組み込みます。例:
{"views":{"byloc":{"map":"function (doc, meta) {\n if (meta.type == \"json\") {\n emit(doc.city, doc.sales);\n } else {\n emit([\"blob\"]);\n }\n}"}}}整形すると、デザインドキュメントはこのようになります:
{ "views" : { "byloc" : { "map" : "function (doc, meta) {\n if (meta.type == \"json\") {\n emit(doc.city, doc.sales);\n } else {\n emit([\"blob\"]);\n }\n}" } } }
トップレベルviewsフィールドは、ひとつ以上のビュー定義(この例では、bylocビュー)、および各ビューでは対応するmap()関数が一覧表示されます。