[英]Mongodb aggregate $match inconsistent handling of dates between mongo and javascript
我在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... }
非常感謝@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。
使用new Date(/*timestmap or whatever parsable value*/).toISOString()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.