почему $ gte и $ lte не работают с определенной датой, такой как «2020/12/09», чтобы получить документы типа ISODate («2020-12-09T04:32:37.266Z»)

#mongodb

#mongodb

Вопрос:

что я делаю не так? Я пытаюсь отфильтровать документы, в которых дата совпадает: 2020/12/09

 let date= "2020/12/09";
let startDate = new Date(new Date(date).setHours(00, 00, 00));  // output: 2020-12-09T05:00:00.000Z
let endDate = new Date(new Date(date).setHours(23, 59, 59, 999));  //output: 2020-12-10T04:59:59.999Z

let filter= {
  mydate: {
    $gte: startDate,
    $lte: endDate,
  },
};

collection:
[{ "mydate":ISODate("2020-12-09T04:32:37.266Z")}]


collection.aggregate(
 [
  {
    $match: filter
  }
 ]
)
 

совпадений не найдено

Ответ №1:

У меня была такая же проблема. Я думаю, что проблема связана с форматом строки даты.

 new Date('2020/12/09') --> 2020-12-08T16:00:00.000Z
new Date('2020-12-09') --> 2020-12-09T00:00:00.000Z
 

Я решил проблему, изменив формат строки даты на гггг-мм-дд и использовал setUTCHours метод вместо setHours , поскольку мне нужно время UTC,

 let date = '2020-12-09'
let startDate = new Date(new Date(date).setUTCHours(0, 0, 0, 0)); --> 2020-12-09T00:00:00.000Z
let endDate = new Date(new Date(date).setUTCHours(23, 59, 59, 999)); --> 2020-12-09T23:59:59.999Z
 

Ответ №2:

Я думаю, что результат верен, поскольку дата в коллекции (2020-12-09T04:32:37.266Z) меньше вашей начальной даты (2020-12-09T05:00:00.000Z)