【问题标题】:Parse Date before insert pymongo在插入 pymongo 之前解析日期
【发布时间】:2021-03-29 16:09:25
【问题描述】:

我有以下类型的 json 文档,我需要使用 pymongo 将其插入到 mongodb 集合中:

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)

但在我看来这不是一个很好的解决方案,因为我的文档在某些情况下有多个日期字段,或者有时某些日期字段为空(例如,在订单中交付的字段可能为空,直到订单交付)

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 语句还不错。

标签: json mongodb pymongo


【解决方案1】:

您可以在每个字段上使用尝试 isoparse,这会将任何有效日期转换为 datetime 格式,因此将作为 BSON date 类型存储在 MongoDB 中。空值将不受影响。

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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2012-02-23
    • 2023-04-04
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多