【问题标题】:CouchDB automatic archivingCouchDB 自动归档
【发布时间】:2014-05-28 09:37:31
【问题描述】:

我有一个使用本地存储 (PouchDB) 的 Angular 应用程序,它会自动与远程服务器上的 CouchDB 数据库同步。

由于我想限制我的应用程序大小,我希望能够根据条件从 CouchDB 自动存档。

这是我的想象:

  • 我在我的 localDB 中保存了一个与我的 CouchDB 同步的文件
  • 几天后,我告诉我的 localDB 归档这个文件
  • 我的 localDB 删除了该文件,CouchDB 会在删除之前自动将该文件复制到另一个内部数据库(未与 localDB 同步)。

您可以说我可以在我的应用程序中执行此操作,但问题是当应用程序离线使用时,它无法直接访问远程 CouchDB 以复制到另一个数据库。

所以我的问题是,CouchDB 能否根据文档中的值(例如存档 = true)自动将文档复制到另一个数据库(在同一个 CouchDB 中)?如果没有,你有什么建议?

【问题讨论】:

    标签: javascript couchdb


    【解决方案1】:

    要保留每个文档的最后一个未删除版本,您可以使用过滤功能在“数据”和“备份”couchdb 数据库之间设置连续复制,以防止 _deleted docs来自复制,例如:

    function(doc, req){
        return !doc._deleted
    }
    

    要专门保留带有archive 属性集的文档,您需要调整过滤功能:

    function(doc, req){
        return !doc._deleted && doc.archive
    }
    

    然而,归档文档现在包含两个步骤:

    1. 使用设置为 localDB 的 archive 属性保存它,触发其复制到您的“数据”数据库(从而触发其复制到“备份”数据库)
    2. 实际上是从 localDB 中删除文档,将删除传播到您的“数据”数据库(使用过滤器功能阻止删除传播到“备份”数据库)确认复制到“数据”数据库后 由于 couchdb 的 replication protocol 中可能存在快进。

    【讨论】:

    • 我仍然缺少一些东西...假设我有一个文档要存档。在我的应用程序中(不要忘记我正在使用 PouchDB,如果需要,它会自动与过滤器同步)所以在我的应用程序中,我将我的文档设置为存档。然后应用程序将删除该文档。因此,一个解决方案(请确认是否可能)是首先将我的文档中的存档参数设置为 true,然后删除该文档。使用您的解决方案,PouchDB 会先将文档与存档参数同步,然后再将其删除吗?还是只会删除它?两个修订版会持续复制吗?
    • Pouchdb 实现了 couchdb 的复制算法(如 couchdb docs 中所述),该算法基于 _changes 提要。复制将单独处理每个文档更改。这意味着没有快进,因此建议的设置应该可以工作。
    • 完美!还有一件事要确保我理解...当您说触发复制时,连续复制应该可以完成这项工作吗?
    • 是的,完全正确。抱歉耽搁了。
    • 我对此进行了进一步调查,阅读了有关 couchdb's replication algorith 的信息。似乎在复制期间实际上可能会发生快速转发:仅复制叶节点,跳过中间修订。解决方案是在删除原始文档之前使用新的_idarchive 属性集保存文档。编辑了我的答案以反映这一点。
    【解决方案2】:

    我认为 CouchDB 没有您正在寻找的确切解决方案。但是,另一种选择是删除文档。 CouchDB 存储完整的修订历史记录(默认最多 1000 个修订),但是当它复制时,它只会复制一个存根:{_deleted: true}

    【讨论】:

    • 谢谢,但它并不真正符合我的期望......你知道我是否可以在更新处理函数中创建这个归档系统(将文档复制到另一个数据库或删除它之前查看)和在 validate_doc_update 函数中调用这个函数?
    • 我不认为这是 validate_doc_update 函数的目的(它是为了安全或模式验证),但你可以在一个单独的过程中使用 _changes 提要,观察变化,然后推送你想要的任何东西想要一个单独的数据库。
    • 另外我想更好地了解您的问题,是否担心用户在浏览器中的数据过多,从而达到 HTML5 存储配额?因为如果是这样,那么过滤复制可能是一个很好的解决方案;你可以过滤!doc.archived 或任何你想要的。
    • 是的,原因是HTML5存储配额(用户可以上传文件)。过滤器的问题在于用户告诉何时归档文档,然后在其浏览器中删除它......那么你怎么能只删除 PouchDB 中的文档并将状态更改为在 couchDB 中归档?
    • 我对 _changes 提要不是很熟悉,但是如何在 CouchDB 中捕获它,即使触发了 javascript 函数(如在 validate_doc_update 中),如何将文档移动到另一个数据库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多