我的数据库中的所有文档都有一个时间戳:
示例文件:
{
...
"timestamp": 1404587326,
...
}
使用地图缩小功能,我可以过滤早于某个日期的所有文档,例如早于昨天的文档,但如何删除早于旧版本的文档?
function(doc) {
var yesterday = Date.now() - (60*60*24);
if(doc.timestamp < yesterday) {
delete(doc._id); // how??
}
}
答案 0 :(得分:3)
首先,您的地图缩减代码不起作用!
只有在文档发生变化时才会调用您的地图功能。因此Date.now()
函数将是更改文档后第一次调用map函数时的日期,而不是访问函数构建的索引的实际时间。
此外,我不知道您可以删除视图中的文档。
这就是你如何实现它
在地图功能中使用日期作为ID,并返回文档的ID。
然后使用您的客户端应用使用startkey
参数调用视图,您可以将其设置为Date.now() - 24*60*60
。
然后,视图将仅返回比startkey
更新的文档,但尚未删除任何文档。
您的地图功能类似于:
function(doc){
emit(doc.timestamp, doc);
}
您真的需要删除文档吗?
如果您确实要删除超过2天的文档,则可能没有使用couchdb的最佳数据库。 Couchbase - 在某些方面类似于couchdb而且MongoDB都提供了文件到期选项,据我所知。
或者,您可以偶尔使用上述地图功能访问文档。但是使用结束键,以便检索所有旧文档。然后,您需要单独删除它们。
最后临时观点
我不确定您为什么要使用其中一种,只需存储您的视图。
答案 1 :(得分:3)
您可以使用@dashservice给定的视图方法,然后发出HTTP DELETE / db / docname,或者如果您有很多这样的端点,则使用_bulk_docs API端点。
常见的couchdb设计模式是将文档存储到单独的数据库中,这些数据库随后可以在不需要这些文档时删除/删除。