MongoDB中如何通过updateOne实现字段删除、总分计算与更新?
MongoDB更新文档:删除指定字段并重新计算总分
错误原因
你当前的写法存在两个核心问题:
- MongoDB的更新操作(非聚合管道模式)不支持执行客户端JavaScript函数,
this无法指向目标文档,因此会报错this.scoreDetailLog is undefined。 - 传统更新语法不能基于文档现有字段动态计算新值,必须使用聚合管道式更新(MongoDB 4.2+支持)来实现这类逻辑。
正确实现代码
let resultData = await ldbDataModel.updateOne( { id: "111" }, // 注意id是字符串类型,要和文档匹配 [ // 第一步:移除指定字段 { $unset: "scoreDetailLog.ITD.XuanNT" }, // 第二步:重新计算总分并赋值 { $set: { total: { $reduce: { input: { $objectToArray: "$scoreDetailLog.ITD" }, initialValue: 0, in: { $add: ["$$value", "$$this.v.score"] } } } } } ] );
代码解释
$unset:直接移除scoreDetailLog.ITD.XuanNT字段,语法上可以直接写路径字符串,不需要键值对形式。$objectToArray:将scoreDetailLog.ITD这个对象转换为[{k: "NVLoi", v: {score:205}}, ...]的键值对数组,方便后续遍历计算。$reduce:遍历转换后的数组,从初始值0开始,累加每个元素的v.score,最终得到新的总分。- 注意查询条件里的
id: "111":你的文档中id是字符串类型,必须用字符串匹配才能找到目标文档。
内容的提问来源于stack exchange,提问作者Loi Nguyen
相关产品推荐
相关产品推荐

