删除 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 中的过期文档的主要内容,如果未能解决你的问题,请参考以下文章