【问题标题】:Moving data between production and staging databases on Cloudant在 Cloudant 上的生产数据库和暂存数据库之间移动数据
【发布时间】:2013-05-03 06:05:04
【问题描述】:

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

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

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

为了在 Node.JS 中完成这项工作,我应该注意哪些方面?有什么通用方法吗?我们是否认为设置错误?

【问题讨论】:

    标签: node.js couchdb cloudant


    【解决方案1】:

    有两种方法可以对数据库本身执行此操作(而不是编写客户端代码来移动数据,这不是最佳选择)。

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

    命名文档复制

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

    【讨论】:

    • 哇,太好了,绝对让我走上正轨。非常感谢。因此,据我了解,复制实际上是通过 POST 到源数据库来调用的,这些 JSON 对象作为主体。我想在我的管理区域中有一个按钮,例如“复制到生产”或类似的东西。该按钮应该只调用服务器上的复制curl,还是有更优雅的方法?
    • 尝试使用 _replicator 数据库 (wiki.apache.org/couchdb/Replication#Replicator_database)。我不确定您的管理区域是用什么语言编写的,但我想您可以使用实现语言的 HTTP 库直接将文档提交到 _replicator 数据库,而不是调用 cURL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    相关资源
    最近更新 更多