Разобрать дату перед вставкой pymongo

У меня есть следующий тип 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
 }

теперь я разбираю даты вручную, используя функцию, но на самом деле это совершенно бесполезно

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

if утверждения неплохие.
D. SM 19.12.2020 06:09
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
1
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать попытку 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}

Другие вопросы по теме