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

View 对时间敏感的Cloudant视图并不总是返回正确的结果,view,cloudant,View,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

我有一个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索引器直到稍后才会触发。在查询视图之前,文档甚至可以保持未索引状态。在这种情况下,索引中的日期不是插入文档的时间,而是索引/查询文档的时间,这可能不是您的意图

不仅如此,数据库的不同碎片副本可能会在不同的时间处理视图构建,这会根据您请求的服务器给出不一致的结果

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

如果您的文档看起来像:

{ 时间戳:1519980078159, 特性:{ 类别:书籍,, 地点:罗马 } }


您可以使用文档中的时间戳值生成索引,您创建的视图将在所有碎片中保持一致,并且具有确定性。

感谢您的响应。我转换了与UTC比较的属性。我假设如果我将“现在”转换为UTC,那么我将比较同一时区(即UTC)中的所有内容。我的事件有开始日期和结束日期,因此我不使用one属性。我想,如果所有的东西都使用UTC,那么我就不会有时区问题,因为我实际上在澳大利亚。我感兴趣的是使用查询视图的时间来进行比较。正如我所说,视图创建时间是一个可移动的盛宴。它将根据负载的不同而变化,无论您是查询视图还是基于每个碎片。谢谢@Glynn Bird。我有一个过于简单化的想法,即每次调用视图时,视图都会运行得很近!我必须检查现在是否介于开始日期和结束日期之间。我设置了一个视图,为活动事件的每一天创建一个索引项。这很好,意味着我可以在URL上使用start_键和end_键进行查询。但我真的希望能够有一个能够返回“今天”事件的静态URL。我想那是不可能的。