如何用Mongoose更新数组元素,不存在则新增对应对象?
用Mongoose实现数组元素的更新或新增
可以实现,你之前的方案只能处理数组中已存在目标元素的情况,要同时覆盖「更新现有元素」和「新增不存在的元素」两种场景,得用MongoDB 4.2+支持的聚合管道式更新,结合条件判断来处理:
const result = await User.updateOne( { email }, [ { $set: { multifactors: { $cond: { // 判断数组中是否存在method为"app"的元素 if: { $in: ["app", "$multifactors.method"] }, then: { // 存在则遍历数组,更新目标元素的verified字段 $map: { input: "$multifactors", as: "elem", in: { $mergeObjects: [ "$$elem", { $cond: [{ $eq: ["$$elem.method", "app"] }, { verified: true }, {}] } ] } } }, else: { // 不存在则拼接原数组与新元素 $concatArrays: ["$multifactors", [{ method: "app", verified: true }]] } } } } } ] );
逻辑说明:
- 用
$in检查multifactors数组的method字段集合中是否包含"app",以此分支处理两种情况 - 存在目标元素时:通过
$map遍历数组,用$mergeObjects对匹配的元素覆盖verified: true,其他元素保持原样 - 不存在目标元素时:用
$concatArrays将原数组与新创建的{method: "app", verified: true}对象合并,实现新增
注意:这个方案要求MongoDB版本在4.2及以上,Mongoose需搭配对应版本的驱动包。
内容的提问来源于stack exchange,提问作者hantoren
相关产品推荐
相关产品推荐

