2つ以上のデザインドキュメントがまったく同じmapとreduceの関数を持っているとき(もちろん異なるID)、同じ署名をとなります(「インデックスファイルシステムの構造と意味」を参照)。これは2つが同じインデックスファイルをポイントし、開発用デザインドキュメントをプロダクション用に公開することができるようにするというまさにその機能を意味し、dev_
プレフィックスを含んでいないIDで開発用デザインドキュメントのコピー(IDは_design/dev_foobarに一致)を作成することで構成され、元の開発用ドキュメントを削除してもインデックスファイルが維持されていることを保証します。これは、同じプロダクション用デザインドキュメントに対して複数の"プロダクション"の別名を持つことを可能にします。ビューエンジン自体は開発用、プロダクション用デザインドキュメントの概念はなく、UIとクラスタレイヤでデザインドキュメント署名/エイリアス機能を利用するのためのこれが唯一の概念となります。
次の例は、このプロパティを示しています。
IDのみが異なる2つの同一のデザインドキュメントを作成します。
shell> curl -H 'Content-Type: application/json' \ -X PUT 'http://localhost:9500/default/_design/ddoc1' \ -d '{ "views": {"view1": {"map": "function(doc, meta) { emit(doc.level, meta.id); }"}}}' {"ok":true,"id":"_design/ddoc1"} shell> curl -H 'Content-Type: application/json' \ -X PUT 'http://localhost:9500/default/_design/ddoc2' -d '{ "views": {"view1": {"map": "function(doc, meta) { emit(doc.level, meta.id); }"}}}' {"ok":true,"id":"_design/ddoc2"}
次に、stale=false
で_design/ddoc1からview1を問い合わると、次のように取得できます:
shell> curl -s 'http://localhost:9500/default/_design/ddoc1/_view/view1?limit=10&stale=false' {"total_rows":1000000,"rows":[ {"id":"0000025","key":1,"value":"0000025"}, {"id":"0000136","key":1,"value":"0000136"}, {"id":"0000158","key":1,"value":"0000158"}, {"id":"0000205","key":1,"value":"0000205"}, {"id":"0000208","key":1,"value":"0000208"}, {"id":"0000404","key":1,"value":"0000404"}, {"id":"0000464","key":1,"value":"0000464"}, {"id":"0000496","key":1,"value":"0000496"}, {"id":"0000604","key":1,"value":"0000604"}, {"id":"0000626","key":1,"value":"0000626"} ] }
stale=ok
で_design/ddoc2からview1を照会した後すぐの場合、両方のデザインドキュメントがエイリアスであるので、まったく同じ結果が得られ、同じシグネチャを共有します:
shell> curl -s 'http://localhost:9500/default/_design/ddoc2/_view/view1?limit=10&stale=ok' {"total_rows":1000000,"rows":[ {"id":"0000025","key":1,"value":"0000025"}, {"id":"0000136","key":1,"value":"0000136"}, {"id":"0000158","key":1,"value":"0000158"}, {"id":"0000205","key":1,"value":"0000205"}, {"id":"0000208","key":1,"value":"0000208"}, {"id":"0000404","key":1,"value":"0000404"}, {"id":"0000464","key":1,"value":"0000464"}, {"id":"0000496","key":1,"value":"0000496"}, {"id":"0000604","key":1,"value":"0000604"}, {"id":"0000626","key":1,"value":"0000626"} ] }
データディレクトリを見てみると、1つのメインインデックスファイルと1つのレプリカインデックスファイルがあります:
shell> tree couch/0/\@indexes couch/0/@indexes ??? default ??? main_1909e1541626269ef88c7107f5123feb.view.1 ??? replica_1909e1541626269ef88c7107f5123feb.view.1 ??? tmp_1909e1541626269ef88c7107f5123feb_main 2 directories, 2 files
また、インデクサが実行されている間に、ノードに対して_active_tasks
で照会する場合、ひとつのインデクサタスクが表示され、design_documents
配列フィールド内に両方のデザインドキュメントが一覧表示されます:
shell> curl -s http://localhost:9500/_active_tasks | json_xs [ { "waiting" : 0, "started_on" : 1345662986, "pid" : "<0.234.0>", "type" : "couch_main_index_barrier", "running" : 1, "limit" : 4, "updated_on" : 1345663590 }, { "waiting" : 0, "started_on" : 1345662986, "pid" : "<0.235.0>", "type" : "couch_replica_index_barrier", "running" : 0, "limit" : 2, "updated_on" : 1345662986 }, { "indexer_type" : "main", "started_on" : 1345663590, "progress" : 75, "initial_build" : true, "updated_on" : 1345663634, "total_changes" : 250000, "design_documents" : [ "_design/ddoc1", "_design/ddoc2" ], "pid" : "<0.6567.0>", "changes_done" : 189635, "signature" : "1909e1541626269ef88c7107f5123feb", "type" : "indexer", "set" : "default" } ]