Node.js Mongodb aggregate$match mongo和javascript之间日期处理不一致
我正在mongodb shell中进行以下聚合: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"}
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等