时间敏感的Cloudant视图并不总是返回正确的结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间敏感的Cloudant视图并不总是返回正确的结果相关的知识,希望对你有一定的参考价值。
我有一个关于Cloudant数据库的视图,该数据库旨在显示在接下来的24小时内发生的事件:
function (doc) {
// activefrom and activeto are in UTC
// set start to local time in UTC
var m = new Date();
var start = m.getTime();
// end is start plus 24 hours of milliseconds
var end = start + (24*60*60*1000);
// only want approved disruptions for today that are not changed conditions
if (doc.properties.status === 'Approved' && doc.properties.category != 'changed' && doc.properties.activefrom && doc.properties.activeto){
if (doc.properties.activeto > start && doc.properties.activefrom < end)
emit([doc.properties.category,doc.properties.location], doc.properties.timing);
}
}
}
这在大多数情况下都可以正常工作,但不时的视图都不会显示预期的结果。
如果我编辑视图,即使只是添加注释,输出也会更改为预期结果。如果我重新编辑视图并删除更改,结果将返回错误的结果。
这是因为视图的时间敏感性吗?有没有更好的方法来实现相同的结果?
答案
MapReduce函数索引的日期是处理工作的服务器执行索引操作的时间。
Cloudant视图不一定在数据添加到数据库时生成。有时,根据群集必须执行的工作量,Cloudant索引器直到稍后才会触发。在查询视图之前,文档甚至可以保持未编制索引。在这种情况下,索引中的日期不是“文档插入的时间”,而是“文档被索引/查询的时间”,这可能不是您的意图。
不仅如此,数据库的不同分片(副本)可能会在不同时间处理视图构建,从而根据您询问的服务器给出不一致的结果!
您可以通过索引源文档中的内容来解决问题,例如
如果你的文件看起来像:
{
"timestamp": 1519980078159,
"properties": {
"category": "books",
"location": "Rome, IT"
}
}
您可以使用文档中的timestamp
值生成索引,并且您创建的视图在所有分片中都是一致的,并且是确定性的。
以上是关于时间敏感的Cloudant视图并不总是返回正确的结果的主要内容,如果未能解决你的问题,请参考以下文章