You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

因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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:11:10