3

我在 Cloudant 上有两个数据库,暂存和生产,它们被运行在 Heroku 上的基于 Node.JS 的 Web 应用程序所使用,还带有暂存和生产实例。Web 应用程序包括一个管理区域,管理员可以在其中检查数据库内容和调整值等。

在两个环境之间移动数据的最佳方法是什么?有时我们希望将新值从暂存转移到生产,也许其他时候将生产数据转移到暂存以帮助测试等,所以它必须是两种方式。

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

为了在 Node.JS 中完成这项工作,我应该考虑什么样的事情?有什么通用方法吗?我们是否在考虑设置错误?

4

1 回答 1

4

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

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

命名文档复制

如果您确切知道要复制哪些文档及其_id',那么您可以在调用复制时在数组中指定它们。例如,这将使用_id'sdoc-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"
}
于 2013-05-02T22:05:04.547 回答