CouchDB如何获取指定数据库最后一次修改的时间戳?
获取CouchDB指定数据库最后修改时间戳的可行方案
经实测,以下三种方案可覆盖不同场景需求:
- 方案1:修正
_changes接口调用参数(临时排查用,无需提前配置)
你之前调用_changes拿不到对应信息,大概率是没加定向取最新变更的参数,不需要拉取全量变更列表,直接发如下请求即可:
接口返回的第一条结果就是库内最新发生的文档新增/修改操作记录。需要注意:CouchDB原生不会为变更操作自动记录时间戳,如果你写入文档时没有自定义存储更新时间字段,这个接口只能返回最新变更的全局序列号(GET /{目标数据库名}/_changes?descending=true&limit=1seq值),拿不到可读时间。 - 方案2:调用数据库元信息接口(高频轮询场景用,性能最高)
直接请求数据库基础信息接口:
返回结果中的GET /{目标数据库名}update_seq字段对应当前库的最新变更序列号,只要库内发生文档新增、修改操作,这个值就会递增。你可以在本地缓存上次查询到的update_seq,值发生变化就说明库有更新,这个接口响应速度极快,但同样原生不携带时间戳信息。 - 方案3:通过设计视图索引取最新时间(生产环境用,结果最准确)
如果需要稳定直接拿到可读的最后修改时间戳,最可靠的方式是提前建视图索引,步骤如下:- 统一文档写入规范:所有文档新增、修改时,都写入自定义的时间戳字段,比如
updated_at,存Unix时间戳或ISO格式时间字符串均可 - 写入如下设计文档创建MapReduce视图:
{ "_id": "_design/db_meta", "views": { "last_modified_time": { "map": "function(doc) { if (doc.updated_at) emit(null, doc.updated_at); }", "reduce": "function(keys, values) { return Math.max.apply(Math, values); }" } } }- 需要取最后修改时间时,直接查询该视图即可,返回的reduce结果就是全库最新的文档更新时间戳:
GET /{目标数据库名}/_design/db_meta/_view/last_modified_time?group_level=0 - 统一文档写入规范:所有文档新增、修改时,都写入自定义的时间戳字段,比如
避坑提示:不要用全量遍历所有文档比对更新时间的方式实现,单库文档量过万之后请求延迟会飙升,还会额外占用数据库大量IO资源。
内容的提问来源于stack exchange,提问作者user12950273
相关产品推荐
相关产品推荐

