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

MongoDB 30万条大集合如何批量将姓名字段转为小写更新旧数据

问题背景

现有一个存储了30万条测试文档的MongoDB集合,person的Schema定义如下:

const person = new Schema({
  firstName: { type: String},
  lastName: { type: String }
})

后续在Schema的firstName、lastName字段中添加了lowercase:true配置,需要将已存在的旧文档对应字段统一更新为小写格式。

已尝试方案及报错

方案1:游标遍历单条保存

实现代码:

CaseFile
.find({ })
.cursor()
.eachAsync(async function (doc) {
  await doc.save()
})

运行报错:

Error: Collection method find is synchronous

方案2:全量查询后遍历保存

实现代码:

CaseFile
.find({ })
.then(docs => {
  docs.forEach(doc => {
    doc.save()
  })
})

运行报错:

JavaScript heap out of memory

该报错是因为30万条文档全量加载到Node.js内存中,超出了内存上限。

最终可用解决方案

运行环境:MongoDB版本为v5.0.2,mongoose版本为^6.0.5
使用聚合管道的批量更新方案,直接在数据库层面完成字段转小写操作,无需将文档加载到服务端内存,更新效率更高:

CaseFile.updateMany({}, [
  {
    $set:
    {
      firstName: { $toLower: '$firstName' },
      lastName: { $toLower: '$lastName' }
    }
  }]
)
.then(res => res)

内容的提问来源于stack exchange,提问作者Scott Barrar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:09:00