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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:39:03