我在使用 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 方法:
了解
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
似乎很模糊,因为可以从结果文档中获取该信息。