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

如何向MongoDB插入含非法值的文档以测试PyMongo库

报错原因

  • MongoDB的BSON日期类型本身支持包含年份0在内的极大时间范围,报错核心是Python内置datetime模块的限制:Python支持的最小年份为datetime.MINYEAR = 1,无法直接构造年份为0的datetime对象,而PyMongo默认会将Python datetime对象转为BSON的ISODate类型,因此直接插入会触发参数校验报错。
  • 额外注意你给出的示例文档存在语法错误:name字段后缺少逗号,gender字段后多了冗余逗号,实际插入时需要先修正语法问题。

解决方案

场景1:必须保留dateOfBirth为BSON日期类型

可以通过bson模块的底层接口直接通过时间戳构造日期,绕过Python datetime的校验限制,示例代码如下:

import bson
from pymongo import MongoClient

client = MongoClient("你的MongoDB连接串")
db = client.test_db
col = db.test_col

# 时间戳均为毫秒级,可根据你需要的具体时间自行换算
raw_bson = bson.encode({
    "CREATED_DATE": bson.datetime_ms(1617836366386),
    "customer": {
        "name": "Customer Name",
        "dateOfBirth": bson.datetime_ms(-62167257634000), # 对应0-12-29T16:19:26.386+07:00的时间戳
        "gender": "F"
    },
    "UPDATED_DATE": bson.datetime_ms(1636562123187)
})
col.insert_one(bson.decode(raw_bson))

场景2:仅测试用,无需严格保留日期类型

直接把dateOfBirth字段存为字符串即可,无需处理时间戳转换,插入成本最低:

from pymongo import MongoClient
from datetime import datetime

client = MongoClient("你的MongoDB连接串")
db = client.test_db
col = db.test_col

doc = {
    "CREATED_DATE": datetime(2021,4,8,5,19,26,386000),
    "customer": {
        "name": "Customer Name",
        "dateOfBirth": "0-12-29T16:19:26.386+07:00",
        "gender": "F"
    },
    "UPDATED_DATE": datetime(2021,11,10,23,35,23,187000)
}
col.insert_one(doc)

内容的提问来源于stack exchange,提问作者enchant3dmango

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:04