时间敏感的Cloudant视图并不总是返回正确的结果

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

我有一个关于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);    
     }
  }
}

这在大多数情况下都可以正常工作,但不时的视图都不会显示预期的结果。

如果我编辑视图,即使只是添加注释,输出也会更改为预期结果。如果我重新编辑视图并删除更改,结果将返回错误的结果。

这是因为视图的时间敏感性吗?有没有更好的方法来实现相同的结果?

view cloudant
1个回答
1
投票

MapReduce函数索引的日期是处理工作的服务器执行索引操作的时间。

Cloudant视图不一定在数据添加到数据库时生成。有时,根据群集必须执行的工作量,Cloudant索引器直到稍后才会触发。在查询视图之前,文档甚至可以保持未编制索引。在这种情况下,索引中的日期不是“文档插入的时间”,而是“文档被索引/查询的时间”,这可能不是您的意图。

不仅如此,数据库的不同分片(副本)可能会在不同时间处理视图构建,从而根据您询问的服务器给出不一致的结果!

您可以通过索引源文档中的内容来解决问题,例如

如果你的文件看起来像:

{ "timestamp": 1519980078159, "properties": { "category": "books", "location": "Rome, IT" } }

您可以使用文档中的timestamp值生成索引,并且您创建的视图在所有分片中都是一致的,并且是确定性的。

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