MongoDB更新管道中如何$unset嵌入式数组内的指定字段?
错误原因
普通更新语法中的$unset支持$[]全数组定位符,但是更新管道模式下的操作逻辑基于聚合表达式体系,不识别普通更新操作的定位符语法,会将$[]识别为非法的字段名前缀,因此触发报错。
解决方法
更新管道中操作数组字段需要通过$map遍历重构数组,删除数组元素下的指定字段即可,不需要用定位符语法:
通用兼容写法(所有支持更新管道的MongoDB版本均可使用)
手动指定需要保留的学生字段,自动过滤掉不需要的age字段:
db.class.updateOne({ _id: ObjectId("609391f436e519039a634311") }, [ { $set: { something: "$name" } }, { $set: { students: { $map: { input: "$students", as: "stu", in: { name: "$$stu.name" // 其余需要保留的学生字段也按这个格式补充即可 } } } } } ])
MongoDB 5.0+ 简化写法
如果使用MongoDB 5.0及以上版本,可以直接用$unsetField删除指定字段,不需要逐个列出保留字段:
db.class.updateOne({ _id: ObjectId("609391f436e519039a634311") }, [ { $set: { something: "$name" } }, { $set: { students: { $map: { input: "$students", as: "stu", in: { $unsetField: { field: "age", input: "$$stu" } } } } } } ])
内容的提问来源于stack exchange,提问作者Chicky
相关产品推荐
相关产品推荐

