2013-05-02 56 views
3

我有两个关于Cloudant,临时和生产的数据库,这些数据库正在Heroku上运行的基于Node.JS的Web应用程序使用,也包含临时和生产实例。该Web应用程序包括一个管理员区域,管理员可以在其中查看数据库内容和调整值等。在Cloudant上的生产和临时数据库之间移动数据

在两种环境之间移动数据的最佳方法是什么?有时候我们会希望将新的值从分期转移到生产,也可能有时候将生产数据转移到分期以帮助进行测试等,因此它必须是两种方式。

整个数据库复制不是一个选项,因为通常我们只想复制某些数据库对象,而不是整个事物。

我应该看看在Node.JS中完成这些事情?任何一般的方法?我们是否在考虑设置错误?

回答

4

有两种方法可以对数据库本身进行此操作(与编写客户端代码以移动数据,这不是最佳的方式)。

有关复制的最新参考,请参阅http://wiki.apache.org/couchdb/Replication(在撰写此答案时,Apache的wiki已关闭)。

命名的文件复制

如果你确切地知道你想复制及_id的,那么你就可以在阵列中调用复制时,他们指定哪些文件。例如,这将复制_iddoc-adoc-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" 
} 
+0

哇,太好了,肯定把我在正确的轨道上。非常感谢。所以据我了解,复制实际上是通过发送到源数据库来调用的,这些类型的JSON对象作为正文。我想在我的管理区域有一个按钮,例如“复制到生产”或类似的按钮。如果该按钮只是在服务器上调用一个复制'curl',或者有更好的方法吗? – WildService 2013-05-09 12:12:29

+1

尝试使用_replicator数据库(http://wiki.apache.org/couchdb/Replication#Replicator_database)。我不确定你的管理区域是用什么语言编写的,但我想你可以直接使用实现语言的HTTP库将文档提交到_replicator数据库,而不是调用cURL。 – 2013-05-09 16:16:36