前段时间遇到的问题,在cnode上求助https://cnodejs.org/topic/5582a4bb395a0c1812f183ea
最后自己解决了,详情如下:
var getCustomerSourceListFromDataToData = function (accountid, startDate, endDate, callback) {
if (!startDate) {//启始时间默认30天前
startDate = moment().subtract(30, 'days').format('L');
}
else {
startDate = moment(startDate).format('L');
}
if (!endDate) {//结束时间默认今天
endDate = moment().add(1, 'days').format('L');
} else {
endDate = moment(endDate).add(1, 'days').format('L');
}
console.log('enddate:' + endDate);
console.log('startDate:' + startDate);
//CustomerSourceModel
// .find({
// date: {
// $gte: startDate,
// $lt: endDate
// }
// }).exec(callback);
CustomerSourceModel
.aggregate()
.match({
date: {
$gte: startDate,
$lt: endDate
}
})
.group({
_id: null,
totalNum: {$sum: "$num"},
})
.exec(callback);
}
如上代码,实现简单的时间区间内的统计数据,结果总是match不到相应的数据,用注释掉的find的代码可以找到相关数据,math却不可以。。
已经确认aggregate方法没问题,去掉match限制,就能统计数totalNum。
mongodb版本 3.04
解决了,又是一个坑啊。是时间的格式写错了。
startDate = moment().subtract(30, ‘days’).format(‘L’);这时候时间是一个月前的时间,格式是2015-05-19.
在mongodb中直接查找db.customersources.find({’date’:{$gte: ‘2015-05-19’ ) }})是查不出来任何符合条件的记录的。
使用db.customersources.find({’date’:{$gte: new Date(2015-05-19 ) }})就可以查出来。
至于为什么在mongoose中下列代码能查询出结果。。。
CustomerSourceModel
.find({
date: {
$gte: '2015-05-19'
}
}).exec(callback);
由于自己看不懂源代码,只能归因于mongoose太任性了吧~
最后将时间格式改成如下形式,看起来好蹩脚,不知道各位是如何设置的
if (!startDate) {//启始时间默认30天前
startDate = moment(moment().subtract(30, 'days').format('L')).toDate();
}
else {
startDate = moment(moment(startDate).format('L')).toDate();
}
if (!endDate) {//结束时间默认今天
endDate = moment(moment().add(1, 'days').format('L')).toDate();
} else {
endDate = moment(moment(endDate).add(1, 'days').format('L')).toDate();
}