如何按schema要求批量导入JSON文件到MongoDB 无需逐条存储
符合Schema约束的MongoDB批量导入解决方案
完全可以实现符合Schema要求的一次性批量导入,不需要通过控制器逐条写入,常用的两种可行方案如下:
方案1:使用MongoDB自带工具mongoimport实现
MongoDB 3.6及以上版本支持为集合预先配置和业务Schema对齐的校验规则,配置完成后直接调用mongoimport命令即可完成导入,导入过程会自动校验所有数据是否符合规则:
- 第一步:先为
Campaigns、Users两个集合创建和业务Schema一致的校验规则,确保必填字段、字段类型、嵌套结构符合要求 - 第二步:将你提供的原JSON文件做简单格式转换:把
Campaigns键下的所有值提取为JSON数组存为campaigns.json,把Users键下的所有值提取为JSON数组存为users.json - 第三步:执行导入命令,开启校验规则即可:
# 导入Campaigns集合,不符合校验的数据会直接被拒绝 mongoimport --uri "你的MongoDB连接地址" --collection campaigns --file campaigns.json --jsonArray --validationAction error # 同理导入Users集合 mongoimport --uri "你的MongoDB连接地址" --collection users --file users.json --jsonArray --validationAction error
方案2:使用Mongoose等ODM的批量插入方法
如果你在项目中使用Mongoose这类ODM工具,直接调用内置的批量插入方法即可,插入前会自动触发Schema校验,不需要逐条调用save方法:
// 读取原JSON文件 const rawData = require('./你的JSON文件路径.json') // 转换Campaigns数据为数组 const campaignList = Object.values(rawData.Campaigns) // 批量插入,开启runValidators确保触发全量Schema校验 await CampaignModel.insertMany(campaignList, { runValidators: true }) // 同理处理Users数据 const userList = Object.values(rawData.Users) await UserModel.insertMany(userList, { runValidators: true })
注意事项
你提供的原JSON采用了「集合名作为顶层键、文档ID作为二级键」的嵌套结构,导入前只需要做一步对象转数组的处理即可,不需要修改每个文档的内部字段结构。
内容的提问来源于stack exchange,提问作者Bhaskar Jha
相关产品推荐
相关产品推荐

