У меня есть следующий тип json-документа, который мне нужно вставить в коллекцию mongodb с помощью pymongo:
json = {
"resource": "/items/6791111",
"user_id": 123456789,
"topic": "items",
"application_id":001,
"attempts": 1,
"sent": "2020-07-22T15:53:06.000-04:00",
"received":"2020-07-22T15:53:06.000-04:00"
}
отправленные и полученные поля являются строками, поэтому, если я запускаю:
collection.insert_one(json)
это будет сохранено как строка в базе данных, как я могу сохранить непосредственно как дату?
Я пробовал что-то вроде этого:
from dateutil.parser import parse
json['sent']=parse(json['sent'])
collection.insert_one(json)
но мне это не кажется хорошим решением, потому что у меня есть документы, которые в некоторых случаях имеют несколько полей даты или иногда какое-то поле даты имеет значение null (например, в заказе может быть доставленное поле равно нулю, пока заказ не будет доставлен)
something like this:
json2 = {
"resource": "/items/6791111",
"user_id": 123456789,
"topic": "items",
"application_id":001,
"attempts": 1,
"sent": "2020-07-22T15:53:06.000-04:00",
"received":Null
}
теперь я разбираю даты вручную, используя функцию, но на самом деле это совершенно бесполезно
И мне нужно, чтобы поле даты анализировалось как даты, чтобы я мог фильтровать по времени.

Вы можете использовать попытку isoparse для каждого поля, которое преобразует любые допустимые даты в формат datetime и, следовательно, будет храниться в MongoDB как тип BSON date. Нули останутся незатронутыми.
from dateutil.parser import isoparse
k, v in json.items():
try:
json[k] = isoparse(v)
except Exception:
pass
Полный рабочий пример:
from pymongo import MongoClient
from dateutil.parser import isoparse
import pprint
collection = MongoClient()['mydatabase'].collection
json = {
"resource": "/items/6791111",
"user_id": 123456789,
"topic": "items",
"application_id":1,
"attempts": 1,
"sent": "2020-07-22T15:53:06.000-04:00",
"received":"2020-07-22T15:53:06.000-04:00",
}
for k, v in json.items():
try:
json[k] = isoparse(v)
except Exception:
pass
collection.insert_one(json)
pprint.pprint(collection.find_one(), indent=4)
дает:
{ '_id': ObjectId('5fde015e794ced49eeaa7a65'),
'application_id': 1,
'attempts': 1,
'nulldate': None,
'received': datetime.datetime(2020, 7, 22, 19, 53, 6),
'resource': '/items/6791111',
'sent': datetime.datetime(2020, 7, 22, 19, 53, 6),
'topic': 'items',
'user_id': 123456789}
ifутверждения неплохие.