Как написать запрос pymongo, чтобы получить все данные на основе даты и времени Python

#python #pymongo

#python #pymongo

Вопрос:

У меня есть более 100 документов, в mongodb которых есть следующие данные:

 {
    "Length": 2.9,
    "Number": 33,
    "Stop Time": "2020-09-20T11:05:58",
    "Start Time": "2020-09-20T11:05:53"
}
  

Я хочу, чтобы запрос получал все документы, которые имеют Start Time больше, чем, скажем 2020-09-20T11:00:00 , и меньше, чем "Stop Time": "2020-09-21T11:10:00"

Для этого я написал запрос ниже

 query = [{'$match': {'Start Time': {'$gte': '2020-09-20T11:00:00'}, 'Stop Time': {'$lt': '2020-09-21T11:10:00'}}}]
  

Итак, я хочу получить все документы между датой 2020-09-20T11:00:00 и временем до 2020-09-21T11:10:00 .

В mongodb я проверил вручную, и у меня есть 56 документов, представленных для указанного выше диапазона дат и времени, но, выполнив этот запрос, я могу получить только for 2020-09-20 , и для него нет данных 2020-09-21 . Чего-нибудь не хватает в моем запросе

 data_list = []
document = opc_collection.aggregate(query)
for x in document:
    data_list.append(x)
print(data_list)
  

Редактировать:

Ниже приведены данные после преобразования из строки в дату и время в БД:

 {
    "Length": 2.9,
    "Number": 33,
    "Stop Time": "2020-09-20 11:05:58",
    "Start Time": "2020-09-20 11:05:53"
}

query = [{'$match': {'Start Time': {'$gte': '2020-09-20 11:00:00'}, 'Stop Time': {'$lt': '2020-09-21 11:10:00'}}}]
  

Ответ №1:

ваша дата 2020-09-20T11:00:00 имеет тип string . Вы должны преобразовать его в datetime.

 datetime.datetime.strptime("2020-09-20T11:00:00", '%Y-%m-%dT%H:%M:%S')
  

Комментарии:

1. Дата-время, хранящееся в mongodb, также находится в строке, и если бы это было так, я бы не получил данные для 2020-09-20 . Пожалуйста, поправьте меня, если я ошибаюсь.

2. О, хорошо. Возможно ли изменить тип в базе данных и вместо этого сохранить даты? Потому что pymongo будет сравнивать строки в алфавитном порядке и не будет сравнивать их как даты. Однако возможно изменить тип поля в запросе mongo, но это будет медленнее, чем прямое сравнение дат.

3. Я просто провел быстрый тест, сохранив дату и время вместо строки. Прежде всего, я не знаю, почему текущее время 20:52 , но mongodb сохраняет его как 02:23 . Я применил приведенный выше запрос, но до сих пор не получил никаких результатов

4. Разница во времени, возможно, связана с часовым поясом. Mongo хранит параметр в конце даты, как в 2020-09-21T12:08:46.512890 02:00 . Итак, у вас есть ISODate(...) в БД, и когда вы запрашиваете, вы преобразовали свою строку в объект datetime?

5. Итак, когда я запрашиваю, я должен запрашивать на основе текущего времени или часового пояса, сохраненного в БД?