MongoDB如何基于同一判断条件同时更新两个字段
问题原因
你写的代码存在两个核心错误,导致更新操作无法同时生效:
- 误用JavaScript逗号运算符:
(表达式1, 表达式2)是JS的逗号运算符语法,会从左到右执行两个表达式,最终仅返回最后一个表达式的结果。你在true分支里写的({ $push: { locationHistoric: locationObject } }, {currentLocation: locationObject}),实际返回值只有{currentLocation: locationObject},两个更新操作根本没有合并到同一个指令对象里传给MongoDB。 - 未使用MongoDB标准更新操作符:MongoDB的更新操作中,普通字段的赋值更新必须放在
$set操作符下,如果直接在更新对象根层级写非$开头的字段,会被识别为全文档替换(即把匹配到的文档除_id外的所有字段替换为你传入的内容),而非单字段更新,这也是你操作逻辑异常的核心原因。
修正方案
把两个更新操作合并到同一个更新指令对象中,普通字段更新统一放到$set下,按条件追加$push操作即可,推荐写法如下:
// 初始化基础更新逻辑:所有场景都要更新currentLocation const updateQuery = { $set: { currentLocation: locationObject } }; // 条件为真时,追加历史位置的push操作 if (historicEnable === true) { updateQuery.$push = { locationHistoric: locationObject }; } const theLocation = await User.findOneAndUpdate( { phone }, updateQuery, { new: true } );
如果偏好三元表达式的简洁写法,也可以用对象展开语法实现:
const updateQuery = { $set: { currentLocation: locationObject }, // 条件成立时追加$push配置,不成立时展开空对象无额外操作 ...(historicEnable === true ? { $push: { locationHistoric: locationObject } } : {}) }; const theLocation = await User.findOneAndUpdate({ phone }, updateQuery, { new: true, });
内容的提问来源于stack exchange,提问作者mier23
相关产品推荐
相关产品推荐

