如何向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
相关产品推荐
相关产品推荐

