【问题标题】:How do I get json output from a date value from mongodb using pymongo如何使用 pymongo 从 mongodb 的日期值获取 json 输出
【发布时间】:2026-01-19 07:05:02
【问题描述】:

我定期收集股市数据,并使用 pymongo 将其存储在 mongodb 中:

db.apple_stock.insert({'time': datetime.datetime.utcnow(), 'price': price})

现在我想要 JSON 格式的输出,以便我可以使用 highstocks:

[
    [1403546401372, 343], 
    [1403560801637, 454], 
    [1403575202199, 345], 
    [1403618402379, 345]
]

Tornado 正在服务器上运行,“mysite.com/api/stock.json”应在 JSON 文件中提供上述数据。

所以,我查询我的数据库并使用 pymongo 的 json_util 转储到 json 中:

from bson.json_util import dumps
dumps(query_result)

我得到的输出是:

[
    [{"$date": 1403546401372}, 343], 
    [{"$date": 1403560801637}, 454], 
    [{"$date": 1403575202199}, 353]]
]

那么如何将第一项从字典更改为日期,只包含值部分?有没有可用的功能,或者我必须遍历列表并自己转换它?

其次,如果我真的必须迭代列表,那么在 MongoDB 中存储以便直接获得所需输出的正确方法是什么?

【问题讨论】:

    标签: python json mongodb pymongo highstock


    【解决方案1】:

    dumps 功能特意在 pymongo 驱动程序实用程序中提供,以提供所谓的extended JSON format

    这样做的目的是提供“类型保真度”,其中 JSON 本身不知道严格的“类型”,例如 BSON 格式的用途,以及 MongoDB 本身使用的内容。它允许将 JSON 传输到“可能”能够理解呈现的“类型”的客户端,例如“$date”或“$oid”,然后使用这些键将 JSON“反序列化”为特定的“类型”在该语言规范下。

    在大多数语言实现下,使用标准形式的 JSON 编码,您会发现“否则”是:

    • 一个有趣的时间值元组
    • 表示时间值的字符串
    • 表示时间值的纪元时间戳

    “自定义序列化”的最佳情况是迭代返回的结构并自己实现类型的序列化。或者只使用dumps 表单以及 JSON 的“解码”,然后删除那些标识“类型”的“键”。

    或者当然只是使用特殊库之外的基本 JSON 编码及其结果。

    导致这种情况的正确 BSON 日期类型是在 MongoDB 中存储的“正确”方式。库函数的使用是“设计使然”。但最终的使用方式实际上取决于您。

    【讨论】: