发现一些奇怪的行为,想知道是否有人可以帮助我理解它,以避免将来出现类似的问题。
创建云端视图我想只返回当前时间戳记的记录。
我很难让它工作,发现区别在于在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})
}
}
}
一切顺利,
斯科特。
答案 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]
图。