是否可以在Apache CouchDB的临时视图中删除文档?

时间:2014-07-05 19:16:27

标签: couchdb

我的数据库中的所有文档都有一个时间戳:

示例文件:

{
    ...
    "timestamp": 1404587326,
    ...
}

使用地图缩小功能,我可以过滤早于某个日期的所有文档,例如早于昨天的文档,但如何删除早于旧版本的文档?

function(doc) {
    var yesterday = Date.now() - (60*60*24);
    if(doc.timestamp < yesterday) {
        delete(doc._id); // how??
    }
}

2 个答案:

答案 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设计模式是将文档存储到单独的数据库中,这些数据库随后可以在不需要这些文档时删除/删除。