删除 CouchDB 中的过期文档

Posted

技术标签:

【中文标题】删除 CouchDB 中的过期文档【英文标题】:Delete expired documents in CouchDB 【发布时间】:2016-09-14 10:14:52 【问题描述】:

我正在使用 couchDB 存储一些数据,但在删除 n 天前插入的文档时遇到问题。

所以,我想通过视图加载我想要删除的文档,并立即对所有这些文档执行 DELETE 请求;但失败了。

示例文档:


"date":"20160912",
"_id":"1xxxxx",
"name":"namal"

查看功能:

function (doc) 
       if(doc.date)
          emit(doc.date,doc);
       
    

加载文档的 URL:

http://localhost:5984/dbx/_design/viewx/_view/date?key=%2220160910%22

删除请求:

curl -X DELETE http://localhost:5984/dbx/_design/viewx/_view/date?key=%2220160910%22

我知道我可以使用 _id 和 _rev 对每个文档执行此操作,如下所示。

curl -X DELETE http://localhost:5984/dbx/1xxxxx?rev="1-1111x1111111x222222x333333"

但在这种情况下,我需要一一删除生成的文档。我想要的是,一次删除一个文档列表(bluk docs)(正如我所提到的,实际的要求是删除在 n 天之前插入的文档)。

此外,我知道清除过期数据的更好方法是使用 CouchBase 或 MongoDb 设置过期时间。但我正在 CouchDB 实现本身中寻找解决方案。

注意:在这种情况下,我想让它们真正删除。不是隐形的。

语言:Java 1.7 操作系统:Ubuntu 14.04 64 位 CouchDB 版本:1.6.1

【问题讨论】:

【参考方案1】:

您可以使用 CouchDB 的批量文档 API 来更新文档(将 _deleted 字段设置为 true 的更新与删除一样好)。

更多信息:http://wiki.apache.org/couchdb/HTTP_Bulk_Document_API#Modify_Multiple_Documents_With_a_Single_Request

对于更永久的东西,您可以使用 CouchDB 的 _purge 命令。 Details here

请注意,此操作不会被复制。因此,如果您有复制设置,则必须在每个数据库上执行此操作。

【讨论】:

感谢您的回答。但它不会删除文档吗?它使它不可见。那么,如何才能像删除一样好呢?正如我在问题中提到的那样,我想让它实际删除。 这是 CouchDB 术语中的“删除”。您是否正在寻找可以删除文档的所有痕迹和历史记录的东西?你想同步这样的“永久删除”吗? 非常感谢库尔。我还没有尝试清除命令。我会检查一下。 我在您提到的清除文档中发现了一条非常重要的评论。 “如果你使用 _purge 来回收空间,那么你几乎可以肯定你不恰当地使用了 CouchDB。开发人员不恰当地使用 _purge 的最常见原因是在管理短期数据(日志条目、消息队列等)时。更好的补救措施是定期切换到新数据库并删除旧数据库(一旦其中的条目全部过期)。”。所以,现在我正在尝试每天创建数据库并在过期时删除整个数据库。

以上是关于删除 CouchDB 中的过期文档的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB 复制而不删除文档

CouchDB学习-介绍

限制在 couchdb 中匿名删除文档

Couchapp - 从 couchdb 中删除文档

从 CouchDB 和 Couchbase-lite 同步和删除已删除的文档

将所有文档关系的日志保存为CouchDB中的反模式吗?