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

MongoDB与Mongoose中如何为数据对象添加id属性?

解决MongoDB/Mongoose批量插入时报错'document must have an _id before saving'的问题

错误根源

你当前代码的核心问题是误用了模型构造函数:new Persons()一次只能创建单个文档实例,你传了两个对象进去,Mongoose无法正确处理,才会抛出_id相关的错误。

正确的批量插入方法

直接使用Mongoose模型的insertMany()方法,它支持一次性插入多个文档,并且会自动为每个文档生成唯一的_id,完全不需要手动处理。修改后的代码如下:

const personSchema = new mongoose.Schema({
  name: String,
  number: Number,
})

const Persons = mongoose.model('Person', personSchema)

// 把要插入的对象放在一个数组里
const personsData = [
  { name: 'Arto Hellas', number: '040123456' },
  { name: 'Jabss', number: '1223132133' }
]

// 使用insertMany批量插入
Persons.insertMany(personsData)
  .then(result => {
    console.log(`成功保存${result.length}条数据`)
    mongoose.connection.close()
  })
  .catch(err => {
    console.error('保存失败:', err)
    mongoose.connection.close()
  })

关于你之前尝试的方案的说明

  • 手动在Schema中定义_id:
    如果你在Schema里显式声明了_id: mongoose.Schema.Types.ObjectId,Mongoose就不会自动为你生成_id了,必须手动给每个文档分配唯一的ObjectId(比如用new mongoose.Types.ObjectId()),这反而增加了工作量,新手完全没必要这么做,默认配置就足够。
  • 逐个创建对象并save:
    这种方法本身是可行的,但批量处理时效率低且代码冗余,insertMany()就是为批量场景设计的,更简洁高效。

内容的提问来源于stack exchange,提问作者Jabri Juhinin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:43:22