CouchDb:如何删除超过6个月的文档?

12

我有一个问题,我想要“自动”删除我的couch中六个月以上的文档。 我的CouchDb实例运行在Linux服务器上,有没有办法实现这个简单的操作(比如编写一个只有两行的shell脚本)?


我更新了我的帖子,希望这能对你有所帮助。 - V-Light
5
V-Light所说的没错,如果你还没有在所有文档中添加时间戳(1)并准备好按时间戳搜索的查询条件(2),那么你是无法做到这一点的。不过,一旦你有了这些,就可以使用jss来进行一次性的Couch批量操作。基本上,你需要运行以下命令:curl --silent $some_query | jss - '{_id: $._id, _rev:$._rev, _deleted:true}' --bulk-docs | curl --silent $some_db/_bulk_dos - JasonSmith
3
由于在谷歌上很难找到,这里是 jss 的链接:https://github.com/iriscouch/jss - Marcello Nuccio
我现在考虑使用基于PHP-CLI的方法,但是在我看来,存储文档创建日期的想法是正确的。 - Robert Heine
2个回答

8
您可以在CouchDB中编写更新函数来删除满足特定条件的文档(在调用函数时可以使用参数):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

唯一需要做的是:使用此函数显式地调用数据库中的每个文档(首先调用_all_docs或_changes)。


谢谢。更新函数正是我所需要的。 - Akshat Jiwan Sharma

5
据我所知,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
}

然后编写一个脚本(例如shell脚本),通过curl获取所有这些ID和DATE,进行过滤,然后再次通过curl从数据库中删除所有_doc_crated日期早于现在6个月的文档。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接