Как получить запись в диапазоне дат в mongodb?

1

В моей коллекции 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
Теги:
date

1 ответ

0
Лучший ответ

Спасибо вам за все ваши намеки. Проблема заключалась в том, что поле 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);
    })
})
  • 1
    Вы можете принять свой собственный ответ, чтобы другие знали, что он получил ответ, и могут связать его как дубликат, если будут заданы другие подобные вопросы. ;-)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню