When 2 or more design documents have exactly the same map and
reduce functions (but different IDs of course), they get the same
signature (see
Section D.7, “Index filesystem structure and meaning”). This means
that both point to the same index files, and it's exactly this
feature that allows publishing development design documents into
production, which consists of creating a copy of the development
design document (ID matches _design/dev_foobar) with an ID not
containing the dev_ prefix and then deleting
the original development document, which ensure the index files
are preserved after deleting the development design document. It's
also possible to have multiple "production" aliases for the same
production design document. The view engine itself has no notion
of development and production design documents, this is a notion
only at the UI and cluster layers, which exploits the design
document signatures/aliases feature.
The following example shows this property.
We create 2 identical design documents, only their IDs differ:
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"}
Next we query view1 from _design/ddoc1 with
stale=false, and get:
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"} ] }
If immediately after you query view1 from _design/ddoc2 with
stale=ok, you'll get exactly the same results,
because both design documents are aliases, they share the same
signature:
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"} ] }
If you look into the data directory, there's only one main index file and one replica index file:
shell> tree couch/0/\@indexes couch/0/@indexes ??? default ??? main_1909e1541626269ef88c7107f5123feb.view.1 ??? replica_1909e1541626269ef88c7107f5123feb.view.1 ??? tmp_1909e1541626269ef88c7107f5123feb_main 2 directories, 2 files
Also, while the indexer is running, if you
query_active_tasksfor a node, you'll see one
single indexer task, which lists both design documents in the
design_documents array field:
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" } ]