Mongodb聚合$匹配mongo和javascript之间的日期处理不一致

时间:2016-08-09 14:35:37

标签: node.js mongodb aggregation-framework

我在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... }

2 个答案:

答案 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()