我在mongodb shell中进行以下聚合:
db.sensors.aggregate([
{ $match: { timestamp: {$gte: ISODate("2016-08-08T15:46:00.0Z")} } },
{ $group: {
_id: "$sensorId",
avgSensor: { $avg: "$value" },
avgDuration: { $avg: "$duration"}
}}
])
工作正常,并为我提供了时间戳晚于15:46的文档汇总。
如果我在Node.js中执行相同的操作:
sensors.aggregate([
{ $match: { timestamp: { $gte: new Date('2016-08-08T15:46.000Z') } } },
{ $group: {
_id: "$sensorId",
avgSensor: { $avg: "$value" },
avgDuration: { $avg: "$duration"}
}}
], function (err,aggregate) { ...error handling stuff }
然后我得到一组不同的(错误的)数据,似乎忽略了所有内容的日期和匹配。
所以我认为ISODate()
和Date()
无法直接比较。知道如何解决这个问题,以便我的javascript工作吗?
这可能是一个线索:如果我尝试在mongodb中执行日期范围,它可以正常工作,但javascript中的日期范围不会返回匹配:
sensors.aggregate([
{ $match: { timestamp: {
$gte: new Date('2016-08-08T15:46.000Z'),
$lt: new Date('2016-08-09T09:00.00Z')
} } },
{ $group: {
_id: "$sensorId",
avgSensor: { $avg: "$value" },
avgDuration: { $avg: "$duration"}
}}
], function (err,aggregate) { ...error handling... }
答案 0 :(得分:1)
非常感谢@chridam的回答。更正的代码(包括工作日期范围)是:
var daystart=new Date(2016,07,08,16,46,0);
var daystop=new Date(2016,07,08,17,46,0);
sensors.aggregate([{$match: { timestamp: { $gte: daystart, $lt: daystop } } }, {$group: { _id: "$sensorId", avgSensor: { $avg: "$value" }, avgDuration: { $avg: "$duration"} }} ], function (err,aggregate) {
......错误处理......}
似乎尝试在Javascript中使用ISODate是个问题。请注意,使用的Date构造函数有点奇怪 - 我必须在8月使用07。
答案 1 :(得分:-2)
使用new Date(/*timestmap or whatever parsable value*/).toISOString()