CouchDB在reduce函数中获取日期的统计信息

CouchDB get stats for dates in reduce function

本文关键字:取日期 统计 信息 获取 reduce 函数 CouchDB      更新时间:2023-09-26

我目前正在使用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])