因update方法弃用警告,如何在updateMany中实现$push操作?
解决MongoDB/Mongoose中update弃用后使用updateMany执行带$push的批量更新
别担心,updateMany完全支持$push操作符的——你之前的误解应该是查阅文档时的小疏漏~
你的原代码用update配合multi: true来批量更新多个文档,这和updateMany的作用完全一致,而且updateMany对所有MongoDB的更新操作符(包括$push、$set)都兼容。
改写后的正确代码
const { ok: studentsUpdated } = await Student.updateMany( // 查询条件:匹配_id在studentsIds数组中的文档 { _id: { $in: studentsIds } }, // 更新操作:同时设置isArchived和往archiveHistory数组push新记录 { $set: { isArchived: true }, $push: { archiveHistory: { $each: [ { adminId: mongoose.Types.ObjectId(loggedAdminId), status: 'deleted', reason: reason } ] } } } // 注意:updateMany默认就是批量更新,不需要再传{ multi: true }选项 );
关键说明
updateMany的参数结构和你之前的update几乎一致,唯一区别是不需要multi: true——因为这个方法本身就是设计用来更新所有匹配查询条件的文档的。$push配合$each的用法完全没问题,这个写法可以一次性往数组里添加多个元素(哪怕你这里只加一个,语法也是合法的)。- 如果你的需求是只更新单个匹配的文档,那才需要用
updateOne,但你的场景是批量更新多个学生,所以updateMany是正确选择。
你可以直接运行这段代码,它的行为和你原来的update({ multi: true })完全一致,同时还能避免弃用警告~
内容的提问来源于stack exchange,提问作者Woppi
相关产品推荐
相关产品推荐

