В моей коллекции mongodb у меня есть запись с:
//mongodb field: "birth_date": "1983-05-06T16:26:32.613Z"
И вот мой запрос на поиск, чтобы получить эту запись в диапазоне:
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}
})
Я думаю, что проблема заключается в формате даты, как я могу получить тот же формат Date(), что и в базе данных?
Я использовал разнообразие, чтобы получить схему БД:
+--------------------------------------------------+
| key | types | occurrences | percents |
| ------------ | -------- | ----------- | -------- |
| _id | ObjectId | 1 | 100.0 |
| bio | String | 1 | 100.0 |
| birth_date | String | 1 | 100.0 |
+--------------------------------------------------+
Я использую пакет "mongodb" для express.js - и не могу использовать ISODate().
ReferenceError: ISODate is not defined
Спасибо вам за все ваши намеки. Проблема заключалась в том, что поле birth_date
было сохранено как String.
Я хочу показать вам в этом ответе, как изменить формат поля из String to Date во всех записях вашей коллекции, а затем как искать по возрасту (в годах), когда вы сохранили только дату рождения. Может быть, это помогает кому-то другому.
Измените формат строки на дату поля 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!");
})
})
Найдите пользователя, которому исполнилось 18 лет:
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);
})
})