MongoDB中仅当字段不存在时设置字段的代码问题求助
问题分析与解决方案
你的代码存在两个核心错误:
- 把聚合操作符
$cond放到了findOneAndUpdate的第三个参数(配置选项区),这个位置只能填写new、upsert这类配置项,不能放置更新逻辑。 $cond属于聚合框架操作符,不能直接作为顶层更新语句使用,必须采用管道形式的更新(将更新内容包装为数组)才能调用这类表达式。
以下是两种符合需求的正确写法:
方案一:用$ifNull实现(简洁推荐)
$ifNull会自动判断字段是否存在或为null,不存在则用指定值替代,存在则保留原值,完美匹配你的需求:
await UserAnalytics.findOneAndUpdate( { user }, [ { $inc: { nbPosts: 1 } }, // 无论bestPost是否存在,都执行自增操作 { $set: { bestPost: { $ifNull: ["$bestPost", newPost._id] } } } ], { new: true } // 可选配置,设置为true返回更新后的文档,默认返回更新前的 );
方案二:用$cond实现(贴合你的原始思路)
如果坚持要用$cond做条件判断,需要将其嵌套在管道更新的$set操作中:
await UserAnalytics.findOneAndUpdate( { user }, [ { $inc: { nbPosts: 1 } }, { $set: { bestPost: { $cond: [ { $exists: ["$bestPost", false] }, // 检查bestPost字段是否不存在 newPost._id, "$bestPost" // 字段存在则保留原有值 ] } } } ], { new: true } );
注意事项
管道形式的更新要求MongoDB版本在4.2及以上,如果你的版本较低,建议升级;若无法升级,可拆分操作先执行$inc再单独判断字段是否存在来更新bestPost,但这种方式是非原子操作,不推荐在并发场景下使用。
内容的提问来源于stack exchange,提问作者Ghost
相关产品推荐
相关产品推荐

