CouchDB设计视图未返回所有超过N秒的记录

oipij1gg  于 2023-09-28  发布在  CouchDB
关注(0)|答案(1)|浏览(191)

我在使用CouchDB设计时遇到了一个问题,根据文档的created属性,该设计应该返回超过5秒的记录。文档会不断地添加到mydb数据库中。
由于某些原因,创建日期小于当前日期(5秒)的文档不会返回。
这是我添加文档的方式:

...
timestamp==$(echo $(( $(date +%s) * 1000 )))
...
curl -X POST -H "Content-Type: application/json" -d "{\"created\": ${timestamp}}" http://localhost:5984/mydb -u "admin:YOURPASSWORD"

如何使用视图查询:

curl -X GET -u "admin:YOURPASSWORD" "http://localhost:5984/mydb/_design/nonce/_view/older_than?limit=100"

如果只添加了几个文档,那么事情就可以正常工作,但是反复这样做不会返回预期的记录数量。
你觉得我哪里做错了吗?
下面是专门创建的示例项目,以了解我在GitHub上做错了什么(上面的示例自动化和相应的GO方法,应该删除返回的记录:
https://github.com/igorrendulic/couchdb-test

wh6knrhe

wh6knrhe1#

emit函数是在创建或更新文档时 * 而不是在查询时 * 在索引文档时调用的,理解这一点很关键。
emit函数

function(doc) 
{ 
    var now = Date.now() - (5 * 1000);
    if (doc.created < now) {
        emit(doc.created, doc._rev); 
    }
}

从文档的created字段中减去5秒(特别是假设该字段存在)并对值进行索引,这似乎没有什么用处。
如果解决方案是返回created字段值比当前时间短5秒或更多的最新文档,那么这个简单的emit就足够了(并且可以为其他查询提供更多的实用程序)。

function(doc) 
{    
    if (doc.created) {
        emit(doc.created, doc._rev); 
    }
}

CouchDB的排序规范导致索引开始处的数值较小,因此查询需要反转排序并提供所需的时间窗口,例如本例中的当前时间小于5秒:

?descending=true&start_key={epoch_time_ms}&limit=100

该查询将返回最多100个created小于或等于epoch_time_ms的文档,最新的文档在结果集中排在第一位。
我必须补充一点,存储_rev似乎很模糊,因为可以从结果文档中获得这些信息。

相关问题