如何在不丢失数据的前提下更新MongoDB集合匹配Mongoose Schema
解决方案
方案1:运行时自动补全,无需修改现有存储数据
如果不需要物理修改MongoDB中已存储的旧文档,只需要业务读取到的结果符合Schema结构,直接使用Mongoose自带特性即可满足需求:
- 普通查询(不调用
lean())时,Mongoose返回的文档实例会自动补全所有Schema中定义、且文档缺失的带默认值的字段,不会修改数据库中存储的原始数据。 - 若需要使用
lean()做高性能查询返回纯JS对象,添加defaults: true参数即可自动补全默认字段:const result = await GuildConfig.find().lean({ defaults: true })
你Schema中定义的servername没有设置默认值且required: false,缺失不会触发校验问题,无需额外处理。
方案2:一次性批量物理更新所有旧文档
如果需要让数据库中存储的所有旧文档都对齐当前Schema结构,执行一次批量更新即可,全程不会丢失已有数据,也不会用到你不希望使用的$push类操作:
await GuildConfig.updateMany( // 匹配所有缺失带默认值字段的文档 { prefix: { $exists: false } }, // 仅设置缺省字段的默认值,不会修改已有字段的值 { $set: { prefix: '+' } }, { upsert: false } )
执行完成后所有旧文档都会补全缺失的prefix字段,原有_id等数据不会有任何变动。
内容的提问来源于stack exchange,提问作者Mihir Garg
相关产品推荐
相关产品推荐

