有两种方法可以对数据库本身进行此操作(与编写客户端代码以移动数据,这不是最佳的方式)。
有关复制的最新参考,请参阅http://wiki.apache.org/couchdb/Replication(在撰写此答案时,Apache的wiki已关闭)。
命名的文件复制
如果你确切地知道你想复制及_id
的,那么你就可以在阵列中调用复制时,他们指定哪些文件。例如,这将复制_id
的doc-a
和doc-b
这两个文档。
{
"source": "https://USER:[email protected]/dbname-qa",
"target": "https://USER:[email protected]/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:[email protected]/dbname-qa",
"target": "https://USER:[email protected]/dbname-production",
"filter": "app/myfilter"
}
哇,太好了,肯定把我在正确的轨道上。非常感谢。所以据我了解,复制实际上是通过发送到源数据库来调用的,这些类型的JSON对象作为正文。我想在我的管理区域有一个按钮,例如“复制到生产”或类似的按钮。如果该按钮只是在服务器上调用一个复制'curl',或者有更好的方法吗? – WildService 2013-05-09 12:12:29
尝试使用_replicator数据库(http://wiki.apache.org/couchdb/Replication#Replicator_database)。我不确定你的管理区域是用什么语言编写的,但我想你可以直接使用实现语言的HTTP库将文档提交到_replicator数据库,而不是调用cURL。 – 2013-05-09 16:16:36