我有一个关于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);
}
}
}
这在大多数情况下都可以正常工作,但是视图不时会显示预期结果。
如果我编辑视图,即使只是添加注释,输出也会更改为预期结果。如果我重新编辑视图并删除更改,结果将返回错误的结果。
这是因为视图的时间敏感性吗?有没有更好的方法来实现相同的结果?
答案 0 :(得分:1)
MapReduce函数索引的日期是处理工作的服务器执行索引操作的时间。
在将数据添加到数据库时,不一定会生成Cloudant视图。有时,根据群集必须执行的工作量,Cloudant索引器直到稍后才会触发。在视图查询之前,文档甚至可以保持未编制索引。在这种情况下,索引中的日期不是“文档插入的时间”,而是“文档被索引/查询的时间”,这可能不是您的意图。
不仅如此,数据库的不同分片(副本)可能会在不同时间处理视图构建,从而根据您询问的服务器提供不一致的结果!
您可以通过索引源文档中的内容来解决问题,例如
如果您的文档如下:
{
"timestamp": 1519980078159,
"properties": {
"category": "books",
"location": "Rome, IT"
}
}
您可以使用文档中的timestamp
值生成索引,并且您创建的视图在所有分片中都是一致的,并且具有确定性。