CouchDB 设计视图不返回所有早于 N 秒的记录

问题描述 投票:0回答:1

我在使用 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

couchdb
1个回答
0
投票

了解

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
似乎很模糊,因为可以从结果文档中获取该信息。

© www.soinside.com 2019 - 2024. All rights reserved.