簡體   English   中英

mongodb聚合$ match mongo和javascript之間的日期處理不一致

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM