2016-08-09 207 views
1

Ich bin in der mongodb Shell die folgende Aggregation tun:

db.sensors.aggregate([ 
    { $match: { timestamp: {$gte: ISODate("2016-08-08T15:46:00.0Z")} } }, 
    { $group: { 
     _id: "$sensorId", 
     avgSensor: { $avg: "$value" }, 
     avgDuration: { $avg: "$duration"} 
    }} 
]) 

die gut arbeitet und gibt mir ein Aggregat von Dokumenten mit einem Zeitstempel später als 15 : 46.

Wenn ich das Äquivalent, was in 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 } 

dann bekomme ich eine andere (falsche) des Datensatzes, der das Datum und Spiel auf, alles zu ignorieren scheint.

Also ich denke, dass ISODate() und Date() nicht direkt vergleichbar sind. Irgendeine Idee, wie ich das löse, damit mein Javascript funktioniert?


Dies kann ein Hinweis sein: Wenn ich versuche, einen Datumsbereich in mongodb tun es funktioniert gut, aber ein Datumsbereich in javascript gibt keine Übereinstimmung:

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... } 
+0

Haben Sie versucht mit dem anderen 'Date' Konstruktor' neues Datum (2016,7,8,15,46,0) '? – chridam

+1

'neues Datum ('2016-08-08T15: 46.000Z')' gibt 'undefined' zurück; Das Node.js-Datum kann ISO-Datumsangaben nicht analysieren. – JohnnyHK

+0

Danke an @chridam für die Antwort. Es scheint, dass alle Bemühungen, das ISODate-Format zu verwenden, nicht funktionieren. –

Antwort

-2

Verwendung new Date(/*timestmap or whatever parsable value*/).toISOString()

+1

Während dieser Code die Frage beantworten kann, würde das Bereitstellen eines zusätzlichen Kontexts bezüglich * wie * und/oder * warum * das Problem lösen, den langfristigen Wert der Antwort verbessern. - [Aus Review] (http://stackoverflow.com/review/low-quality-posts/13280122) –

+0

Ich fürchte, das hat nicht funktioniert - aber mit dem anderen Date-Konstruktor als @chridam schlägt, schlägt die Arbeit. –

1

Viele Danke an @chridam für die Antwort. Der korrigierte Code (komplett mit Datumsbereich arbeitet) ist:

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) { 

... Fehlerbehandlung ...}

Es scheint, dass isodate in Javascript war das Problem zu verwenden versuchen. Beachten Sie, dass der verwendete Datumskonstruktor mit Monaten etwas seltsam ist - ich musste 07 für August verwenden.

+0

Bei Verwendung des JavaScript-Konstrukts [** 'Date()' **] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date) ist der Monatsparameter '0- 'indexbasiert dh Januar ist 0, Feb ist 1 etc – chridam