Mongoose中findOneAndUpdate是否支持用同文档其他字段值更新数据
解答
核心结论
你提到的需求可以实现,你原有写法无法生效的原因是直接写test.email会读取Node.js运行环境上下文的变量,而不是MongoDB中待更新文档的字段值,需要使用聚合管道形式的更新语法才能引用文档内的字段完成操作。
正确实现代码
await UserModel.findOneAndUpdate( { 'test.token': token, }, // 数组包裹代表使用聚合管道更新,MongoDB 4.2+ 支持该语法 [ { $set: { email: "$test.email", // 用$+字段路径引用当前文档的test.email字段值 test: null } } ], // 可选配置:返回更新后的文档,默认返回更新前的旧文档 { new: true } )
补充说明
- 从MongoDB 4.2版本开始,
findOneAndUpdate、updateOne、updateMany等更新方法均支持传入聚合管道作为第二个参数,允许在更新逻辑中引用待更新文档自身的字段值。 - 引用文档字段时需要添加
$前缀拼接字段路径,比如"$test.email"就指代当前待更新文档下test对象的email字段值。
内容的提问来源于stack exchange,提问作者Antoni
相关产品推荐
相关产品推荐

