You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:07:33