如何使用pymongo从mongodb获取日期值的json输出

0 投票
1 回答
1130 浏览
提问于 2025-04-18 10:54

我正在定期收集股市数据,并使用 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 中存储数据的正确方式是什么,这样我就能直接得到所需的输出?

1 个回答

0

dumps这个功能是在pymongo驱动工具中专门提供的,目的是为了支持一种叫做扩展JSON格式

这样做的目的是为了保持“类型的一致性”,因为普通的JSON并不知道像BSON格式那样严格的“类型”,而MongoDB正是使用这种格式。扩展JSON可以让我们把JSON传输给可能理解这些“类型”的客户端,比如“$date”或“$oid”,然后这些客户端可以利用这些键把JSON转换成特定的“类型”。

如果你使用大多数编程语言的标准JSON编码,你会发现得到的结果通常是:

如果你想要“自定义序列化”,最好的办法是遍历返回的结构,自己实现类型的序列化。或者你可以使用dumps的形式,再对JSON进行“解码”,然后去掉那些标识“类型”的“键”。

当然,你也可以选择直接使用基础的JSON编码,而不依赖于这个特殊的库及其结果。

在MongoDB中,正确的BSON日期类型是存储数据的“正确”方式。使用这个库的功能是“有意为之”。但最终你如何使用这些功能,还是取决于你自己。

撰写回答