我目前正在使用couchDB,并且在构建日期的reduce函数时遇到问题。
数据库由不同位置的时间线数据组成。每个条目都有一个'locationId'(字符串),一个'datetime'(数组以字典形式保存,如[年,月,日,小时,分钟,秒]),一个值(双精度)
我想找出,在每个有值存在的位置,哪个是最低和最高的日期时间。时间轴值具有不同的开始日期和结束日期。
在第一次尝试中,我使用_stats on milliseconds:地图:
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() ) }
减少:_stats
提供每个locationId正确的最小和最大毫秒数。现在我想有输出在一个更可读的形式(格式化日期字符串)
我尝试了不同的方法,这是最后一个:- map将locationId作为键,将Date作为值- reduce将每个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);
}
这会导致value为'null'。这种情况下是否可以有格式化的日期输出?
我已经找到了解决方案:
地图: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;
}
result: (key=locationID, value=[origindate, latestDate])