Cloudant使用日期查看异常条件行为

时间:2017-02-01 11:52:29

标签: ibm-cloud cloudant

发现一些奇怪的行为,想知道是否有人可以帮助我理解它,以避免将来出现类似的问题。

创建云端视图我想只返回当前时间戳记的记录。

我很难让它工作,发现区别在于在if条件结束之前有一个空格。

请参阅下面的工作和不工作

 if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0) ){

根据Cloudant文档日期检查当前日期

 if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0)){

无法根据Cloudant文档日期检查日期

上下文的完整工作视图

function (doc) {
  if (doc.details.location){
    if (new Date(Date.parse(doc.details.timestamp)).setHours(0,0,0,0) === new Date().setHours(0,0,0,0) ){
      emit(doc.details.location.toLowerCase(), { "location": doc.details.location.toLowerCase(), "status": doc.details.status, "user": doc.details.username, "time": doc.details.timestamp})
    }
   }
 }

一切顺利,

斯科特。

1 个答案:

答案 0 :(得分:3)

我怀疑这可能与if语句的执行日期/时间有关,而不是涉及的空间。

无论执行时间如何,map函数都必须是确定性的。

看起来就像你猜测map函数在查询时运行一样(所以new Date会发出今天的日期)。相反,它在索引时运行,因此new Date的值是索引发生时的日期时间。由于索引在文档插入的不同时间运行(在插入和查询视图之间的某个时间),因此使用随时间变化的任何形式的值都将产生不可预测的结果。

因此我怀疑这个空间是偶然的,而new Date的输出正在改变,因此改变了你视图中发出的内容。

对于你的问题 - 查询“今天”的事情 - 我想你想要发出像[location, year, month, day]这样的密钥。你的地图功能如下:

function (doc) {
  if (doc.details.location) {
    var l = doc.details.location.toLowerCase();
    var d = Date.parse(doc.details.timestamp);
    emit([l, d.getFullYear(), d.getMonth(), d.getDate()], { 
      "location": l, 
      "status": doc.details.status, 
      "user": doc.details.username, 
      "time": doc.details.timestamp
    });
  }
}

由于JavaScript使用当月基于0的索引,要查询今天(2017年2月2日)Bristol位置的所有项目,您可以在查询中使用key=["bristol",2017,1,2]图。