Python读取MongoDB数据时遇bson日期越界错误求助
解决MongoDB查询时的
bson.errors.InvalidBSON: date value out of range错误 问题原因
你遇到的错误是因为MongoDB集合中部分文档的日期字段(birthday/id_expiry/license_expiry等)存储了超出Python BSON库解析范围的日期值,导致迭代游标解析数据时触发异常。注意find()本身只是创建游标,不会立即执行查询和解析,所以错误会在你开始遍历结果时才出现。
解决方案
1. 定位并修复异常数据(推荐)
先通过MongoDB Shell找出存在非法日期的文档,再修正数据:
// 查询所有日期字段超出合法范围的文档 db.drivers.find({ $or: [ { birthday: { $lt: ISODate("1970-01-01T00:00:00Z") } }, { birthday: { $gt: ISODate("9999-12-31T23:59:59Z") } }, { id_expiry: { $lt: ISODate("1970-01-01T00:00:00Z") } }, { id_expiry: { $gt: ISODate("9999-12-31T23:59:59Z") } }, { license_expiry: { $lt: ISODate("1970-01-01T00:00:00Z") } }, { license_expiry: { $gt: ISODate("9999-12-31T23:59:59Z") } } ] })
找到异常文档后,将非法日期修改为合法范围内的值(比如1970-01-01),或者设置为null标记无效。
2. 在Python中自定义解析逻辑绕过异常
如果暂时无法修改数据库数据,可以通过自定义BSON日期解码器来捕获解析异常:
from bson import codecs from datetime import datetime def custom_date_decoder(seconds): try: return datetime.utcfromtimestamp(seconds) except (OverflowError, ValueError): # 解析失败时返回None或自定义标记值 return None # 注册自定义解码器 codecs.register(custom_date_decoder, 'date') # 执行原有查询逻辑 drivers = mongodb_global('drivers') filter_col = { "created": 1, "updated": 1, "_id": 1, "name": 1, "birthday": 1, "id_expiry": 1, "license_expiry": 1 } data = drivers.find({}, filter_col) driver_lst = [] for item in data: print(item)
或者使用原始BSON模式手动处理异常文档:
from bson import BSON from bson.errors import InvalidBSON drivers = mongodb_global('drivers') filter_col = { "created": 1, "updated": 1, "_id": 1, "name": 1, "birthday": 1, "id_expiry": 1, "license_expiry": 1 } # 开启raw模式获取原始BSON字节 data = drivers.find({}, filter_col, raw=True) driver_lst = [] for raw_doc in data: try: doc = BSON(raw_doc).decode() driver_lst.append(doc) print(doc) except InvalidBSON as e: print(f"跳过解析失败的文档: {str(e)}") # 可选:记录异常文档的_id以便后续处理
内容的提问来源于stack exchange,提问作者Padam Rai
相关产品推荐
相关产品推荐

