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
相关产品推荐
相关产品推荐

