2016-09-13 16 views
2

Ich benutze Node.js und Express auf einem Webserver, um MongoDB auf einem Dbserver abzufragen und in ein Problem zu geraten, die Daten zusammenzuarbeiten, ich habe gelesen Bündel von Threads hier über das Problem, vor allem diese:Suche nach ISODate mit Node.js, Express und MongoDB

Inserting and Querying Date with MongoDB and Nodejs

ich bin mir ziemlich sicher, dass ich verstehe, was ich tue werden soll, aber nichts, was ich scheint versuchen zu arbeiten. erwarten

var todayStart = new Date(); 
todayStart.setSeconds(0); 
todayStart.setHours(0); 
todayStart.setMinutes(0); 
todayStart.setMilliseconds(0); 

var todayEnd = new Date(todayStart); 
todayEnd.setHours(23); 
todayEnd.setMinutes(59); 
todayEnd.setSeconds(59); 
todayEnd.setMilliseconds(999); 

var query = { 
    "date": { 
     $gte: new Date(todayStart).toISOString(), 
     $lte: new Date(todayEnd).toISOString() 
    } 
}; 

Meine Anfrage var auf der Konsole im Format I:

In meinem JS-Datei, ich habe folgendes

{ date: 
    { '$gte': '2016-09-13T00:00:00.000Z', 
    '$lte': '2016-09-13T23:59:59.999Z' } 
} 

ich versuche, entweder meine Abfrage Variable zu verwenden oder das Datum vars selbst, und beide geben ein Ergebnis von Null (keine Fehler) zurück:

db.collection('test').findOne(query, function(err, result) { 
db.collection('test').findOne({"date" : {$gte: new Date(todayStart).toISOString(),$lte: new Date(todayEnd).toISOString() }}, function(err, result) { 

Allerdings wenn ich nur p lug in meine Daten wie folgt, es gibt mein Ergebnis zurück:

db.collection('test').findOne({"date" : {$gte: new Date("2016-09-13T00:00:00.000Z"),$lte: new Date("2016-09-13T23:59:59.999Z") }}, function(err, result) { 

Eine Idee, was ich hier fehlt?

Antwort

2

Keine Notwendigkeit, die Daten in ein ISO-Zeichenfolgenformat zu konvertieren, nur Abfrage mit den JS-Daten. Eine detaillierte Erklärung finden Sie unter documentation.

Objekt Ihres Startdatums sollte die aktuelle Datum Zeit Stunden bei 00 halten: 00: 00.000 (Millisekunden Genauigkeit) und die Stunden für die heutige Datum auf 23: 59: 59.999 bis zum Enddatum Variable:

var todayStart = new Date(); 
todayStart.setHours(0,0,0,0); 

var todayEnd = new Date(); 
todayEnd.setHours(23,59,59,999); 

var query = { 
    "date": { 
     $gte: todayStart, 
     $lte: todayEnd 
    } 
}; 

db.collection('test').findOne(query, function(err, result) { 
    if (err) throw new Error(); 
    console.log(JSON.stringify(result)); 
}); 

Wenn Sie die momentjs Bibliothek verwenden, kann dies durch die Verwendung der startOf() und endOf() Methoden auf das Moment der aktuellen Date-Objekt durchgeführt werden, vorbei an der Zeichenfolge ‚Tag‘ als Argumente:

var todayStart = moment().startOf('day'); // set to 12:00 am today 
var todayEnd = moment().endOf('day'); // set to 23:59 pm today 
+1

Dank einer Tonne. Ich habe es eindeutig überkompensiert. Lief wie am Schnürchen. –

+1

@NickSchroeder Keine Sorge, gerne helfen – chridam

0

Sie isodate verwenden können,

var isodate = require('isodate'); 



var query = { 

"date" : { 
       '$gte' : isodate(todayStart), 
       '$lt' : isodate(todayEnd) 
      } 
};