2

我需要将CouchDB 中的数据从一个数据库复制到另一个数据库,但在此过程中我想更改正在复制的文档

  1. 主要剥离特定领域(但评论中提到的其他应用程序)。
  2. 复制总是 100% 单向(但评论中提到的其他应用程序可以使用双向和同步)
  3. 我希望这个过程不增加他们的修订 ID,但这可能要求太多。

但我没有看到任何设计文档功能可以做我想做的事情。

似乎没有这样做,有什么计划来添加这个?同时,有什么解决方法?

4

3 回答 3

2

不,没有开箱即用的解决方案,因为这将违背多主机 MVCC 逻辑的整个目的和逻辑。

我在这里看到的唯一选择是创建自己的解决方案,但我不会将其称为复制,而是称为 ETL(提取、转换、加载)。对于 ETL,有一些可用的工具可以让你做到这一点,比如(在这里混合开源和商业):

市场上有更多的 ETL 工具。

于 2012-05-05T00:58:14.657 回答
1

我相信这里最好的方法是将要过滤的字段分解为单独的文档,然后在复制期间过滤掉该文档。

于 2012-05-05T05:57:23.040 回答
-1

当然,最好的方法是为此提供内置支持,但我想到的一种解决方法是,而不是在这里使用内置复制,来编码和使用自定义复制,这将执行额外的所需更改/转换,仍然使用而不是使用其他内置插件,并且编码良好,在许多情况下(特别是如果每​​个主服务器都可以推送到它的从服务器),感觉这可能几乎同样有效。

  1. 这需要在每个源/主服务器上放置有效的触发器来检测任何更改,我相信 CouchDB 确实提供了(或者至少PouchDB 似乎提供了),然后将更改复制到另一个位置,同时进行完整的更改。
  2. 如果更改的源无法将更改推送到最终目的地,则此固定存储可能位于目的地可以从中提取的本地位置 - 这可能会变得非常昂贵,尤其是在多主机中,因为每个位置都必须不仅存储和维护自己的数据,还存储它发送给每个人的数据(正在发送)。
  3. 此复制还将每个源文档的修订 ID 放置在文档的副本中...
    1. ...理想情况下,如果要{更新,又名主人}副本也是必不可少的。
    2. ...形式为:
      1. 理想情况下是正常的“_rev”属性。事实上,这看起来很可能(“保留他们的修订 ID”)已经通过使用内置“批量文档 API”的正常复制算法完成,看起来我们的变体也会使用
      2. 否则有一个新的副本对象(带有自己的_rev)加上另一个字段作为“_rev_original”,说明原始版本。但是,那行得通吗?
      3. 显然,可以创建这样的副本没有问题。
      4. 如果目的地只是读取数据,可能没什么大不了的。
      5. 如果目的地也在写入数据,这似乎很麻烦。因为我们现在必须与这些非标准版本合并。但可行。
    3. 与此相关(编码自定义/改进的复制(执行此明显缺失的功能)理想情况下不改变 Pouch 尤其是 Couch 源代码),作为入门/基础材料(标准方法),这是正常的 Couch 复制算法,不幸的是没有明确说它只使用内置操作,但它看起来像它,以及它的官方概述;我怀疑 Pouch 实现了这一点,可能在Pouch 的 replicate.js (最新版本截至 2014.07)中。

进一步的实施细节?- 知道的人,请放在这里。

这是一个“社区维基”答案,所以请扩展它。

也请评论任何人/系统的链接和详细信息已经或试图这样做或类似的。

于 2014-07-08T23:27:55.893 回答