在Cloudant上的生产数据库和临时数据库之间移动数据

时间:2013-05-02 09:52:17

标签: node.js couchdb cloudant

我有两个关于Cloudant,登台和制作的数据库,这些数据库由在Heroku上运行的基于Node.JS的Web应用程序使用,也包含登台和生产实例。 Web应用程序包括一个管理区域,管理员可以在其中检查数据库内容和调整值等。

在两种环境之间移动数据的最佳方法是什么?有时我们会想要将新值从分段转移到生产,也许有时候会将生产数据移到分段以帮助进行测试等,所以它必须是双向的。

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

我应该在Node.JS中完成哪些工作?任何一般方法?我们是否在考虑设置错误?

1 个答案:

答案 0 :(得分:4)

有两种方法可以使用数据库本身(而不是编写客户端代码来移动数据,这不是最佳的)。

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

命名文档复制

如果您确切地知道要复制哪些文档及其_id,则可以在调用复制时在数组中指定它们。例如,这会使用_id的{​​{1}}和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

此代码存储在您的设计文档中。以下是存储上述函数的示例ddoc:

return (doc.type === "user");

然后在复制期间调用过滤器,如下所示:

{
  "_id": "_design/app",
  "filters": {
    "myfilter": "function(doc) { return (doc.type === \"user\"); }"
  }
}