Проблема агрегации MongoDb / Mongoose с датой совпадения - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь использовать агрегатную функцию Mongoose / MongoDb для сопоставления документов на основе даты.Хотя моя агрегатная функция сопоставляет документы по другим фильтрам, она просто не работает по дате.Я делюсь своим кодом ниже.

"$match": {
    "createdAt": {"$lt": new Date()}
}

Я пробовал разные даты, начиная с даты ISO, хранящейся в моей базе данных mongoDb, но, похоже, ни одна из них не работает.Я понятия не имею, что является причиной этой проблемы.Несмотря на то, что я много искал в Интернете, я не нашел ничего убедительного.Тот же запрос, выполненный в оболочке mongoDb, работает нормально, что позволяет мне полагать, что это может быть проблемой с Mongoose и способом ее приведения даты.

Это данные, которые я тестировал с

{
     "_id" : ObjectId("5be7fc909625592852d422b4"),
     "time" : ISODate("2018-11-11T09:55:28.704Z"),
    "receiver" : ObjectId("5be5d727d3f24e06b144e229"),
    "createdAt" : ISODate("2018-11-11T09:55:28.718Z"),
    "updatedAt" : ISODate("2018-11-11T09:55:28.718Z"),
}
{
    "_id" : ObjectId("5be807902b789e5c3c05dc5e"),
    "time" : ISODate("2018-11-11T10:42:24.410Z"),
    "receiver" : ObjectId("5be5d727d3f24e06b144e229"),
    "createdAt" : ISODate("2018-10-09T18:30:00Z"),
    "updatedAt" : ISODate("2018-10-09T18:30:00Z"),
}

Я застрял, не зная, как действовать дальше.Я попробовал все из моего понимания, но ничего не работает.Я надеюсь, что смогу получить помощь по этому вопросу.

Очень признателен, спасибо.

1 Ответ

0 голосов
/ 12 ноября 2018

Возможно, вы столкнулись с проблемой часового пояса.Я только что попробовал вызов new Date().getTimezoneOffset() внутри node и внутри mongo.Оба возвращают разные результаты (узел возвращает -60, оболочка mongo возвращает 0 на моем компьютере).

Вы можете удалить смещение часового пояса с помощью следующего кода:

let d = new Date()
var offset = d.getTimezoneOffset() * 60000 // This converts the given minutes to milliseconds.
var utc = d.getTime() + offset
var nd = new Date(utc)

"$match": {
    "createdAt": { "$lt": nd }
}

Когда выпреобразуйте время, которое вы теперь должны получить ожидаемые результаты.

Это разумно, так как MongoDB использует UTC в качестве формата времени.Преобразование может показаться немного громоздким в ванильном JavaScript.В качестве альтернативы вы можете использовать такую ​​библиотеку, как moment.js.

...