有两种方法可以对数据库本身执行此操作(而不是编写客户端代码来移动数据,这不是最佳选择)。
有关复制的最新参考,请参阅http://wiki.apache.org/couchdb/Replication(在撰写此答案时,Apache 的 wiki 已关闭)。
命名文档复制
如果您确切知道要复制哪些文档及其_id,则可以在调用复制时在数组中指定它们。例如,这将使用_id 的doc-a 和doc-b 复制两个文档。
{
"source": "https://USER:PASS@USER.cloudant.com/dbname-qa",
"target": "https://USER:PASS@USER.cloudant.com/dbname-production",
"doc_ids": [ "doc-a", "doc-b" ]
}
过滤复制
如果您可以通过编程方式确定要移动哪些记录,则可以使用过滤复制。如果要复制文档,则编写一个返回 true 的函数,如果不希望复制该文档,则返回 false。比如……
function(doc) {
/*
* This will not replicate doc deletions. Add `&& doc._deleted` to replicate
* those as well.
*/
if(doc.type === "user") {
return true;
}
return false;
}
...将复制所有type 属性等于"user" 的记录。
您也可以删除整个 if 块,如果您觉得舒服,只需执行 return (doc.type === "user");。
此代码存储在您的设计文档中。这是一个存储上述函数的示例 ddoc:
{
"_id": "_design/app",
"filters": {
"myfilter": "function(doc) { return (doc.type === \"user\"); }"
}
}
然后在复制期间调用过滤器,如下所示:
{
"source": "https://USER:PASS@USER.cloudant.com/dbname-qa",
"target": "https://USER:PASS@USER.cloudant.com/dbname-production",
"filter": "app/myfilter"
}