MongoDB执行insertOne时提示Document failed validation,插入失败求助
排查MongoDB插入验证失败问题
核心问题分析
你的插入操作触发验证失败,根源有两个:
1. 聚合日期操作符使用错误
$toDate和$dateFromString是聚合管道专用操作符,不能直接赋值给变量作为普通字段值。你当前代码里的asOfDt和timeStamp是包含操作符的对象,而非实际的Date类型数据。如果集合的验证规则要求asOfDate、creationTs、revisionTs是日期类型,这种对象会直接触发验证失败。
2. 变量引用错误
audit数组里的creationTs和revisionTs被加了双引号,变成了字符串"timeStamp",而非引用之前定义的timeStamp变量。这会导致这两个字段的类型(字符串)不符合验证规则中可能要求的日期类型。
修正后的代码
方法1:直接创建Date对象(推荐)
直接用ISODate或new Date生成符合要求的日期类型:
// 创建asOfDt日期对象 asOfDt = ISODate("2023-09-27"); // 转换US/Central时区时间为MongoDB存储的UTC时间 // US/Central夏令时为UTC-5,非夏令时为UTC-6,需根据实际时间确认偏移 timeStamp = new Date("2023-09-15T16:26:22-05:00"); doc = { "dataBaseName": "cos_db", "asOfDate": asOfDt, "audit": [ { "creationTs": timeStamp, "creationProgramName": "ManualMongo", "creationUserIdCode": "P046158", "revisionTs": timeStamp, "revisionProgramName": "ManualMongo", "revisionUserIdentificationCode": "P046158" } ] }; db.coll.insertOne(doc); db.coll.find();
方法2:使用聚合操作符插入(MongoDB 4.2+支持)
如果需要保留日期转换逻辑,可通过runCommand结合聚合表达式插入:
db.runCommand({ insert: "coll", documents: [ { "dataBaseName": "cos_db", "asOfDate": {$toDate: "2023-09-27"}, "audit": [ { "creationTs": {$dateFromString: {"dateString":"2023-09-15T16:26:22", "timezone": "US/Central" }}, "creationProgramName": "ManualMongo", "creationUserIdCode": "P046158", "revisionTs": {$dateFromString: {"dateString":"2023-09-15T16:26:22", "timezone": "US/Central" }}, "revisionProgramName": "ManualMongo", "revisionUserIdentificationCode": "P046158" } ] } ] })
额外排查步骤
如果修正后仍报错,需检查集合的验证规则,执行以下命令查看:
db.getCollectionInfos({name: "coll"})
确认规则中对字段的类型、必填项、取值范围等要求,确保插入的文档完全匹配。
内容的提问来源于stack exchange,提问作者Neha Sinha
相关产品推荐
相关产品推荐

