MongoDB执行update报需原子操作符错误原因求解
问题原因
- 你编写的update语句第二个参数是不含任何MongoDB原子操作符(如
$set/$unset)的普通文档,这种写法的语义是全文档替换:匹配到的文档会被完全覆盖为你传入的{"delayed":false},原文档的aircraft/departingFrom等所有字段都会被清除,仅保留_id和delayed两个字段。 - 你遇到的报错是
mongosh(MongoDB新官方Shell)的默认校验规则导致的:mongosh 1.0+版本为了避免用户误操作执行全文档覆盖,默认要求update语句的更新参数必须携带原子操作符,否则就会抛出Update document requires atomic operators错误。 - 课程示例能正常运行的原因是课程使用的是旧版Legacy
mongoShell(MongoDB 4.4及更早版本自带的默认Shell),旧版Shell没有这项安全校验,允许update方法直接执行全文档替换。 - 该现象并非MongoDB 5.0服务端不支持该写法,只是新的mongosh客户端默认做了安全拦截,避免用户误操作丢失数据。
解决方法
根据你的实际需求选择对应方案即可:
- 如果你只是想给文档新增
delayed字段、不覆盖原有内容,使用$set原子操作符即可:
db.flightData.update({_id:ObjectId("611aaa554a0269583c8d81b1")}, {$set: {"delayed": false}})
- 如果你确实需要执行全文档替换操作,改用
replaceOne方法更符合规范:
db.flightData.replaceOne({_id:ObjectId("611aaa554a0269583c8d81b1")}, {"delayed": false})
内容的提问来源于stack exchange,提问作者Chandan Kumar
相关产品推荐
相关产品推荐

