Почему MongoDB запрос диапазона дат возвращает результат emtpy при запросе на ту же дату и один день раньше? - PullRequest
1 голос
/ 02 мая 2020

У меня есть коллекция mongodb, в которой хранится информация о платежах пользователей, купивших видео

Содержимое:

{
    "_id" : ObjectId("5ea17279ca73ec19f84ac39a"),
    "createdAt" : ISODate("2020-04-23T10:48:25.920Z"), // 23 Apr 2020
    "updatedAt" : ISODate("2020-04-23T10:48:25.920Z"),
    "accountId" : "0000",
    "postId" : ObjectId("5e8da8533efaa66ce53bd3bb"),
    "paidBy" : ObjectId("5e92e9ffda29d826d46f7562"),
    "paidGet" : ObjectId("5e465194366a412b7107a1c8"),
    "chargeId" : "0520114401000000538",
    "status" : "Charging",
    "isDeleted" : false,
    "chargeAmount" : "12",
    "transferAmount" : "0",
    "postPrice" : "1.00",
    "__v" : 0
}
{
    "_id" : ObjectId("5ea173a9ca73ec19f84ac39c"),
    "createdAt" : ISODate("2020-04-23T10:53:29.957Z"), //23 Apr 2020
    "updatedAt" : ISODate("2020-04-23T10:53:29.957Z"),
    "accountId" : "0000",
    "postId" : ObjectId("5e8da8533efaa66ce53bd3bb"),
    "paidBy" : ObjectId("5ea1673bca73ec19f84ac392"),
    "paidGet" : ObjectId("5e465194366a412b7107a1c8"),
    "chargeId" : "0520114401000000552",
    "status" : "Charging",
    "isDeleted" : false,
    "chargeAmount" : "12",
    "transferAmount" : "0",
    "postPrice" : "1.00",
    "__v" : 0
}

Моя проблема:

Мне нужно запросить коллекцию на основе диапазона дат по полю createdAt:

Я использую $gte и $lte для запроса

Теперь мне нужно найти платежи, произошедшие 23 апреля 2020 года

Мои запросы:

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lte" : ISODate("2020-04-23")}}).pretty()

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lte" : ISODate("2020-04-23")}}).pretty()

Но этот запрос ничего не возвращает: то есть диапазоны дат 22 апреля 20 - 23 апреля 20 && 23 апреля 20 - 23 апреля 20 , возвращая пустой результат

Но этот запрос работает, если я добавлю один дополнительный день, то есть 24 апреля [22 апреля 20 - 24 апреля 20]

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lte" : ISODate("2020-04-24")}}).pretty()

А также это: [ 23 апреля 20 - 24 апреля 20]

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lte" : ISODate("2020-04-24")}}).pretty()

Дата D => дата, которую нужно найти = 23 апреля 2020 года:

Так что моя проблема в том, если я дал диапазон дат который начинается за день до этой даты D и заканчивается в ту же дату D [22 апреля 20 - 23 апреля 20] ... Нет результата:

И если я дал ту же дату D в начале и конец, [23 апреля 20 - 23 апреля 20] ... никакого результата не получено

Но если бы я дал один дополнительный день в качестве даты окончания, то результат был бы [22 апреля 20 - 24 апреля 20]

А также, если начальная дата - это дата D, а конечная дата - на один день больше, результат приходит: [23 апреля 20 - 24 апреля 20]


Почему это странное совпадение? Пожалуйста, помогите мне

1 Ответ

1 голос
/ 02 мая 2020

Если вы внимательно его наблюдаете ISODate("2020-04-23T10:48:25.920Z"), вы заметите, что он был создан в 2020-04-23 в 10:48:25.920. Поэтому, когда вы делаете ISODate("2020-04-23"), это приводит к ISODate("2020-04-23T00:00:00.000Z"), поэтому вы не получаете никаких результатов. Итак, ваши первые два запроса, которые не выполняются, должны выглядеть следующим образом:

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-22") , "$lt" : ISODate("2020-04-24")}}).pretty()

db.payment.find({"createdAt" : {"$gte" : ISODate("2020-04-23") , "$lt" : ISODate("2020-04-24")}}).pretty()

Поэтому, если вы выполните "$lt" : ISODate("2020-04-24"), это будет гарантировать, что ни один из документов из "2020-04-24" не будет извлечен в результате, потому что мы Проверяю на createdAt < ISODate("2020-04-24T00:00:00.000Z").

...