我使用PyMongo来简单地迭代Mongo集合,但是我很难处理大型Mongodb日期对象。
例如,如果我的集合中有一些数据如下所示:
"bad_data" : [
{
"id" : "id01",
"label" : "bad_data",
"value" : "exist",
"type" : "String",
"lastModified" : ISODate("2018-06-01T10:04:35.000Z"),
"expires" : Date(9223372036854775000)
}
]我会做这样的事情:
from pymongo import MongoClient, database, cursor, collection
client = MongoClient('localhost')
db = client['db1']
db.authenticate('user', 'pass', source='admin')
collection = db['collection']
for i in collection:
# do something with i并得到错误InvalidBSON: year 292278994 is out of range
有什么方法可以让我处理这个简陋的Date()对象而不掉下来呢?我意识到在Mongodb中有这样一个约会是疯狂的,但我对此无能为力,因为这不是我的数据。
发布于 2018-11-06 20:17:36
实际上,PyMongo常见问题中有一个关于这个主题的部分:
为什么我要将OverflowError解码日期存储在另一种语言的驱动程序中? PyMongo将BSON值解码为Python的
datetime.datetime实例。datetime.datetime的实例仅限于datetime.MINYEAR(通常为1)和datetime.MAXYEAR(通常为9999)之间的年份。一些MongoDB驱动程序(例如PHP驱动程序)可以存储BSON日期时间,其年值远远超出datetime.datetime支持的值。
因此,这里的基本约束是datetime.datetime类型,它是为驱动程序从BSON映射而实现的,尽管它可能“荒谬”,但其他语言创建这样一个日期值是有效的。
正如常见问题中所指出的,您的一般解决办法是:
当然,'expires'作为一个名称,意味着该值的最初意图是一个永远不会实现的日期,该数据的原始作者(以及非常可能正在编写该数据的当前代码)不知道"Python“约束。因此,在所有文档中以及任何代码仍在编写的地方“降低”这个数字可能是非常安全的。
https://stackoverflow.com/questions/53177590
复制相似问题