问题 CouchDb:如何删除旧版> 6个月的文件?


我有一个问题,我喜欢“自动”删除我沙发上至少6个月大的文件。 我的CouchDb实例在linux服务器上运行,有没有办法实现这个非常简单(比如写一个简单的2行shell脚本)?


2994
2018-06-20 12:46


起源

我更新了我的帖子。我希望它会对你有所帮助 - V-Light
V-Light是正确的,如果没有(1)所有文档中的时间戳,以及(2)准备按时间戳搜索的查询,则无法执行此操作。但是,如果你有这个,我会用 jss 一次性散装沙发工作。基本上: curl --silent $some_query | jss - '{_id: $._id, _rev:$._rev, _deleted:true}' --bulk-docs | curl --silent $some_db/_bulk_dos - JasonSmith
由于谷歌很难找到,这里是jss的链接: github.com/iriscouch/jss - Marcello Nuccio
我现在正在考虑基于PHP-CLI的方法,但在我看来,关于存储文档创建日期的想法是正确的想法。 - Rob


答案:


您可以在couchdb中编写一个更新函数,删除某些条件的文档(您可以在调用函数时使用params):   http://wiki.apache.org/couchdb/Document_Update_Handlers#Creating_an_Update_Handler 

(看看“就地”并想象设置“_delete:true”)。

就像是

"deletefunc":
...
if(doc.created_at<req.query.mindate) {
  doc._deleted:true;
  return [doc, "deleted"]
}

并打电话     ... DB / _design / updatefuncdesigndoc / _Update / deletefunc / dok_id_x?MINDATE = 20110816

唯一的工作是:使用此函数显式调用数据库中的每个doc(首先调用_all_docs或_changes)


7
2018-02-16 23:15



谢谢。更新功能是我想要的。 - Akshat Jiwan Sharma


只要我知道,CouchDB将每个数据库(包含所有文档)存储在一个 单个文件 ()。因此,您将无法通过其名称或添加日期时间找到特定文档。

更新:

我认为唯一的方法是在每个文档中添加一个“_doc_created”(或“_doc_established”)字段,并带有时间戳(与SQL的相似之处) NOW())。然后创建一个视图,仅显示文档ID的值为“_doc_created”字段:

例如。

function(doc) {
  emit(doc._doc_created, doc._id); 
  //or just emit(doc._doc_created) 'couse views alsways return docIDs
}

然后写一个脚本(例如a shell脚本)获取所有这些ID和日期(通过 卷曲),过滤它然后(再次通过 卷曲删除数据库中的所有文档 _doc_crated datetime从现在开始超过6个月


5
2018-06-20 14:29



+1。与大多数文件系统和RoR等系统不同,CouchDB不要求或建议您在数据中保留时间戳。这是不幸的,因为成功的应用程序(即那些“活了几个月或几年”的应用程序)几乎总是需要以后的信息。就像种树一样,现在是清理数据的下一个最佳时机。由于CouchDB已放宽,您可以根据需要为记录添加时间戳,并根据需要查询和删除它们。 - JasonSmith
虽然添加时间戳的方法很好,但运行“清除脚本”的建议方法是一种非常复杂的方法。请参阅“couchdb中的更新功能”,了解更简单的方法并利用相应的couchdb功能。 - Jay