2017-06-19 3 views
1

In meiner mongodb Sammlung habe ich einen Datensatz mit:Wie erhalte ich einen Datensatz innerhalb eines Datumsbereichs in mongodb?

var birthYear = 1983; 
var birthDateStart = new Date('1.1.' + birthYear); //Sat Jan 01 1983 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 
var birthDateEnd = new Date('12.30.' + birthYear); //Fri Dec 30 1983 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 
    var cursor = db.collection('users').find({ 
      birth_date: {$gte: birthDateStart, $lt: birthDateEnd} 
     }) 

Ich denke, das Problem ist, das Datumsformat, wie:

//mongodb field: "birth_date": "1983-05-06T16:26:32.613Z" 

Und hier meine Entdeckung Abfrage, diesen Rekord im Bereich zu bekommen kann ich das gleiche Date() Format wie das in der Datenbank bekommen?

verwendete ich variety das DB-Schema zu erhalten:

+--------------------------------------------------+ 
| key   | types | occurrences | percents | 
| ------------ | -------- | ----------- | -------- | 
| _id   | ObjectId |   1 | 100.0 | 
| bio   | String |   1 | 100.0 | 
| birth_date | String |   1 | 100.0 | 
+--------------------------------------------------+ 

Ich benutze das 'mongodb' Paket für Express.js - und isodate können nicht().

ReferenceError: ISODate is not defined 
+0

Es ist in diesem Format. Sie betrachten das "stringified" -Formular. Aber Ihre Daten könnten möglicherweise selbst Strings sein. Zeigen Sie Ihre tatsächlichen Daten aus der [Mongo Shell.] (Https://docs.mongodb.com/manual/reference/program/mongo/#bin.mongo). Das wird uns sicher sagen, wie Ihre "birth_date" -Daten tatsächlich aussehen. –

+0

Auch sollte "neues Datum (" yyyy-mm-dd ") sein, um ein" Date "-Objekt im UTC-Zeitraum als MongoDB zu konstruieren Daten sollten gespeichert werden, aber wieder müssen wir die tatsächliche Darstellung der Daten sicher sein .. –

+0

Mögliches Duplikat von [Objekte zwischen zwei Daten finden MongoDB] (https://stackoverflow.com/questions/2943222/find-objects -zwischen-zwei-dates-mongodb) –

Antwort

0

Vielen Dank für Ihre Hinweise. Das Problem war, dass das Feld birth_date als String gespeichert wurde.

Ich möchte Ihnen in dieser Antwort zeigen, wie Sie das Format eines Feldes von String zu Datum in allen Datensätzen in Ihrer Sammlung ändern und dann nach Alter (in Jahren) suchen, wenn Sie nur das Geburtsdatum gespeichert haben. Vielleicht hilft es jemand anderem.

Ändern Sie den String-Format Datum des Feldes birth_date:

mongo.connect(url, function (err, db) { 
     console.log(err); 
     var resultArray = []; 
     var cursor = db.collection('users').find({}); 
     cursor.forEach(function (doc, err) { 
      console.log(doc); 
      db.collection('users').update({_id: doc._id}, {$set: {birth_date: new Date(doc.birth_date)}}); 
     }, function() { 
      db.close(); 
      res.send("Done!"); 
     }) 
    }) 

einen Benutzer suchen, die 18 Jahre alt ist:

var search_age = 18; 
var birthYear = new Date(Date.now()).getFullYear() - search_age; 
var birthDateStart = new Date(birthYear, 0, 1); 
var birthDateEnd = new Date(birthYear, 11, 31, 23, 59, 59, 999); 
var resultArray = []; 

mongo.connect(url, function (err, db) { 
    console.log(err); 
    var resultArray = []; 
    var cursor = db.collection('users').find({ 
      birth_date: {$gte: birthDateStart, $lt: birthDateEnd}, 
     }) 
     ; 
    cursor.forEach(function (doc, err) { 
     resultArray.push(doc); 
    }, function() { 
     db.close(); 
     res.send(resultArray); 
    }) 
}) 
+1

Sie können Ihre eigene Antwort akzeptieren, so dass andere wissen, dass sie beantwortet wird und sie als Duplikat verlinken können, wenn andere ähnliche Fragen gestellt werden. ;-) – RobG

Verwandte Themen