Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Mongodb aggregate$match mongo和javascript之间日期处理不一致_Node.js_Mongodb_Aggregation Framework - Fatal编程技术网

Node.js Mongodb aggregate$match mongo和javascript之间日期处理不一致

Node.js Mongodb aggregate$match mongo和javascript之间日期处理不一致,node.js,mongodb,aggregation-framework,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"}

我正在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不能直接比较。你知道我是如何解决这个问题的吗

这可能是一个线索:如果我尝试在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... }

使用新日期/*timestmap或任何可解析值*/.toISOString

使用新日期/*timestmap或任何可解析值*/.toISOString

非常感谢@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。请注意,构造函数使用的日期与月份相比有点奇怪-我不得不在8月份使用07

非常感谢@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。请注意,构造函数使用的日期与月份相比有点奇怪-我不得不在8月份使用07

您是否尝试过其他日期构造函数new Date 2016,7,8,15,46,0?new Date'2016-08-08T15:46.000Z'返回未定义;Node.js日期无法解析ISO日期。感谢@chridam的回答。似乎任何使用ISODate格式的努力都无效。您是否尝试过其他日期构造函数new Date 2016,7,8,15,46,0?new Date'2016-08-08T15:46.000Z'返回未定义;Node.js日期无法解析ISO日期。感谢@chridam的回答。似乎任何使用ISODate格式的努力都不起作用。虽然此代码可能会回答这个问题,但提供关于如何和/或为什么解决问题的额外上下文将提高答案的长期价值。-恐怕这不起作用-但是使用@chridam建议的其他日期构造函数可以完成这项工作。虽然这段代码可能会回答这个问题,但提供有关如何和/或为什么解决问题的额外上下文将提高答案的长期价值。-恐怕这不起作用-但是使用@chridam建议的另一个日期构造函数就可以了。当使用JavaScript构造函数时,月份参数是基于0索引的,即一月是0,二月是1等。当使用JavaScript构造函数时,月份参数是基于0索引的,即一月是0,二月是1等