我目前从couchDB开始,在日期构建reduce函数时遇到问题。
数据库由不同位置的时间线数据组成。每个条目都有一个' locationId' (字符串),'日期时间' (以[年,月,日,小时,分钟,秒]等字典形式保存的数组),值(双精度)
我想知道,对于存在值的每个位置,这是最低和最高的日期时间。时间轴值具有不同的开始和结束。
在第一次尝试时,我在毫秒上使用了_stats: 地图:
function(doc) {
emit(doc.locationId, new Date(doc.datetime[0],doc.datetime[1],doc.datetime[2], doc.datetime[3], doc.datetime[4], doc.datetime[5]).getTime() ) }
reduce:_stats
这为每个locationId提供了正确的最小和最大毫秒数。 现在我想以更易读的形式(格式化日期字符串)
输出我尝试了不同的方法,这是最后一个: - map将locationId作为键传递,将Date作为值传递 - 减少每个日期的转换为毫秒, 使用Math.min找到最早的日期, 将毫秒重新转换为日期并返回
地图:
function(doc) {
emit(doc.locationId, new Date(doc.datetime[0], doc.datetime[1],doc.datetime[2], doc.datetime[3], doc.datetime[4], doc.datetime[5]) ) }
减少:
function(keys, values) {
var timestamps = new Array(values.length);
var i = 0;
var date;
for( date in values ) { timestamps[i] = date.getTime(); i++; }
var min = Math.min.apply(null, timestamps);
return new Date(min);
}
这会导致“无效”'为了价值。 是否可以为此案例设置格式化的日期输出?
答案 0 :(得分:0)
我找到了解决方案:
图:
function(doc) {
if (doc.datetime && doc.plantId)
emit(doc.plantId, [new Date(doc.datetime[0],doc.datetime[1]-1,doc.datetime[2],doc.datetime[3],doc.datetime[4],doc.datetime[5],0), new Date()] )
}
减少
function(keys, values) {
values.sort();
var date = [values[0][0], values[values.length-1][0]];
return date;
}
结果:(key = locationID,value = [earliestDate,latestDate])