Node.js使用Mongoose批量导入JSON到MongoDB无集合问题排查
现有代码问题排查
- 连接语法错误:你写的
mongoose.connect('mongodb://localhost:27017/person'), { useNewUrlParser: true};括号位置错误,数据库配置项没有实际传入connect方法。同时你的代码没有等待数据库连接建立就直接执行插入操作,插入回调返回的成功是虚假状态,此时操作还没实际发送到数据库,进程就已经退出,所以看不到生成的集合。 - Schema字段名不匹配:JSON样例里的姓名字段是
lastName(N大写),你定义的Schema里是lastname(全小写),如果开启了strict模式会过滤掉不匹配的字段。 - Mongoose默认集合名规则:你定义的模型名为
Person,Mongoose会自动转换为小写复数people作为集合名,如果要自定义集合名可以在Schema第二个参数传入{ collection: '自定义名称' }避免歧义。
两类数据对应的Schema定义
类型1(人员数据)Schema
const personSchema = new mongoose.Schema({ name: String, lastName: String // 和JSON字段名完全一致 }, { collection: 'persons' }) // 可选参数,强制指定集合名 const Person = mongoose.model('Person', personSchema)
类型2(库存数据)Schema
// 嵌套的商品子Schema const stockItemSchema = new mongoose.Schema({ name: String, amount: Number }) // 嵌套的库存统计子Schema const inStockSchema = new mongoose.Schema({ count: Number, items: [stockItemSchema] }) // 主Schema const productSchema = new mongoose.Schema({ id: Number, type: String, inStock: [inStockSchema] }, { collection: 'products' }) const Product = mongoose.model('Product', productSchema)
JSON解析与批量插入完整实现代码
const fs = require('fs/promises') const mongoose = require('mongoose') // 1. 定义人员模型 const personSchema = new mongoose.Schema({ name: String, lastName: String }, { collection: 'persons' }) const Person = mongoose.model('Person', personSchema) // 2. 定义库存模型 const stockItemSchema = new mongoose.Schema({ name: String, amount: Number }) const inStockSchema = new mongoose.Schema({ count: Number, items: [stockItemSchema] }) const productSchema = new mongoose.Schema({ id: Number, type: String, inStock: [inStockSchema] }, { collection: 'products' }) const Product = mongoose.model('Product', productSchema) // 3. 通用JSON导入工具函数 async function importJson(filePath, Model) { try { // 读取并解析JSON文件 const content = await fs.readFile(filePath, 'utf8') const dataList = JSON.parse(content) // 批量插入,ordered设为false时单条数据错误不会中断整体导入 const result = await Model.insertMany(dataList, { ordered: false }) console.log(`成功导入${result.length}条数据到${Model.collection.name}集合`) } catch (err) { console.error(`导入文件${filePath}失败:`, err) } } // 4. 主执行逻辑 async function run() { try { // 等待数据库连接成功后再执行导入 await mongoose.connect('mongodb://localhost:27017/person') console.log('数据库连接成功') // 替换为你实际的JSON文件路径 await importJson('./people.json', Person) await importJson('./products.json', Product) // 导入完成后关闭连接 await mongoose.disconnect() console.log('所有导入任务完成') } catch (err) { console.error('执行失败:', err) await mongoose.disconnect() } } run()
注意事项
- 确保本地MongoDB服务正常启动,27017端口没有被占用,目标数据库有读写权限
- 如果使用Mongoose 6以下版本,连接数据库时可以补充配置
{ useNewUrlParser: true, useUnifiedTopology: true } insertMany性能远高于循环单条插入,完全满足上百条甚至上万条数据的导入需求
内容的提问来源于stack exchange,提问作者foreverStudent
相关产品推荐
相关产品推荐

