如何使用Model.findAndUpdate在MongoDB现有JSON对象中执行加法更新?
MongoDB 实现特定月份分类成本累加更新的 findAndUpdate 写法
需求说明
需要对MongoDB文档中指定年份(示例为2022)下的特定月份,将对应分类(Food、Traveling、Medical)的成本值与传入的增量数组执行累加操作,最终更新文档数据。
实现思路
使用MongoDB的$inc操作符实现数值累加,通过动态字段路径关联传入的目标月份和分类,结合findAndUpdate方法完成原子性更新。
具体代码实现
假设你通过接口收到的Patch请求数据为:
const patchData = { "month":"March", "monthData":[70,45,100] };
1. 构建更新对象
利用JavaScript模板字符串动态生成需要累加的字段路径:
const { month, monthData } = patchData; const updateObj = { $inc: { [`2022.${month}.Food`]: monthData[0], // 累加Food分类成本 [`2022.${month}.Traveling`]: monthData[1], // 累加Traveling分类成本 [`2022.${month}.Medical`]: monthData[2] // 累加Medical分类成本 } };
2. 调用findAndUpdate
替换filter为你的文档定位条件(比如_id或其他唯一标识),执行更新:
Model.findAndUpdate( { _id: "目标文档ID" }, // 过滤条件,定位要更新的文档 updateObj, { new: true } // 可选:设置为true时返回更新后的文档,默认返回更新前的文档 ) .then(updatedDocument => { console.log("更新后的文档:", updatedDocument); }) .catch(error => { console.error("更新失败:", error); });
关键说明
$inc是MongoDB专门用于数值增减的操作符,能保证原子性更新,避免并发更新冲突- 如果年份是动态可变的,同样可以用模板字符串替换,比如
${targetYear}.${month}.Food - 若目标月份或分类字段不存在,
$inc会自动创建该字段并设置为对应增量值(示例中已有对应字段,无需额外处理)
内容的提问来源于stack exchange,提问作者chaitanya tyagi
相关产品推荐
相关产品推荐

