Python 遍历PyMongo光标会抛出无效IDBSON:年份超出范围
我使用PyMongo来简单地迭代Mongo集合,但我正在努力处理大型Mongodb日期对象 例如,如果我在一个集合中有一些数据如下所示:Python 遍历PyMongo光标会抛出无效IDBSON:年份超出范围,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,我使用PyMongo来简单地迭代Mongo集合,但我正在努力处理大型Mongodb日期对象 例如,如果我在一个集合中有一些数据如下所示: "bad_data" : [ { "id" : "id01", "label" : "bad_data", "value" : "exist", "type" : "String",
"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
并获取错误invalidson:year 292278994超出范围
我有没有办法处理这个奇怪的
Date()
对象而不摔倒?我意识到在Mongodb中有这样的约会是疯狂的,但我对此无能为力,因为这不是我的数据。PyMongo FAQ中实际上有一个关于这个主题的部分:
PyMongo将BSON datetime值解码为Python的datetime.datetime
实例。datetime.datetime
的实例限于datetime.MINYEAR
(通常为1)和datetime.MAXYEAR
(通常为9999)之间的年份。一些MongoDB驱动程序(例如PHP驱动程序)可以存储BSON日期时间,其年值远远超出datetime.datetime
所支持的值
因此,这里的基本约束是驱动程序为BSON映射实现的datetime.datetime
类型,尽管这可能“荒谬”,但其他语言创建这样的日期值是有效的
正如常见问题解答中所指出的,您的一般解决方法是:
result = db['collection'].find({ }, projection={ 'expires': False })
for i in result:
# do something with i
当然,
“expires”
,顾名思义,该值的原始意图是一个日期,到了将来它永远不会出现,而该数据的原始作者(很可能是当前编写该数据的代码)并不知道“Python”日期约束。因此,在所有文档中以及任何代码仍在编写的地方“降低”该数字可能是非常安全的。我刚刚遇到了同样的问题:
正如尼尔所提到的,我引用:
PyMongo将BSON datetime值解码为Python的datetime.datetime实例。datetime.datetime的实例是有限的
所以在仔细观察我的对象之后,我注意到一些日期对象是这样的:0000:12:30T00:00:00
在我的例子中,最好的方法是在将文档插入集合之前设置验证,因此如果日期为0,则将其设置为1970解决了问题
谢谢你的帮助。我还找到了一种方法,可以通过调用
\uu getitem\uuuu
函数来迭代结果,并跳过返回invalidson
的任何结果。@grinferno-您有没有这种检查的示例?
result = db['collection'].find({ }, projection={ 'expires': False })
for i in result:
# do something with i