首页 / MongoDB 入门教程 / 插入文档

MongoDB 入门教程

插入文档

本教程共 50 篇 · 第 11 篇 · 更新于 2026-07-30 · 约 7 分钟阅读

MongoDBMongoDB 入门教程insertOneinsertManyinsertedId自增

11. 插入文档

本节目标:学会用 insertOne 和 insertMany 写数据,看懂返回值,并理解 MongoDB 没有自增主键该怎么替代。

11.1 insertOne:插入一条

最简单的方式,一次写一条:

// 往 users 插入一条
db.users.insertOne({
  _id: 1,
  name: "张伟",
  email: "zhangwei@example.com",
  age: 28,
  city: "北京",
  tags: ["vip"],
  registered_at: ISODate("2024-01-15")
})

返回结果告诉你插入成不成功:

{ acknowledged: true, insertedId: 1 }

11.2 insertMany:一次插多条

多条数据用 insertMany 更省事,参数是一个文档数组:

// 一次插入多个用户
db.users.insertMany([
  {
    _id: 2,
    name: "李娜",
    email: "lina@example.com",
    age: 34,
    city: "上海",
    tags: ["new"],
    registered_at: ISODate("2024-03-22")
  },
  {
    _id: 3,
    name: "王芳",
    email: "wangfang@example.com",
    age: 22,
    city: "广州",
    tags: ["new", "vip"],
    registered_at: ISODate("2024-05-01")
  }
])
{
  acknowledged: true,
  insertedIds: [ 2, 3 ]
}

11.3 看懂返回值

返回值里两个字段最关键:

字段含义
acknowledged服务端是否确认收到写入,true 表示成功落盘确认
insertedId / insertedIds实际写入的 _id(你指定就用你的,没指定就是自动生成的 ObjectId)
Tip

insertedId 存起来很有用——比如插入用户后,拿这个 id 去跳转到用户主页。

11.4 没写 _id 会怎样

你完全可以不写 _id,让 MongoDB 自动补一个 ObjectId:

// 不指定 _id,自动生成
db.users.insertOne({ name: "赵敏", city: "深圳" })
{
  acknowledged: true,
  insertedId: ObjectId("665f1c2b9a1b2c3d4e5f6071")
}

11.5 重复 _id 会报错

_id 在集合内必须唯一。重复插入同一个 _id 会抛重复键错误:

MongoServerError: E11000 duplicate key error collection: shop.users index: _id_ dup key: { _id: 1 }
Warning

如果你用固定整数当 _id,批量插入前务必确认不会撞号。用自动 ObjectId 就不会有这烦恼。

11.6 自增主键怎么办

关系型数据库有 AUTO_INCREMENT,MongoDB 没有。常见三种替代:

方案一:直接用 ObjectId(最常用,默认即如此)。

方案二:计数器集合(counters)。自己维护一个递增序号:

// 建一个计数器集合
db.counters.insertOne({ _id: "user_id", seq: 0 })

// 每次取号并 +1
const r = db.counters.findAndModify({
  query: { _id: "user_id" },
  update: { $inc: { seq: 1 } },
  new: true
})
db.users.insertOne({ _id: r.seq, name: "新用户" })

方案三:用业务主键。比如用户编号本来就是唯一字符串,直接当 _id

Note

据 MongoDB 8.3 官方文档,标准集合里的每个文档都需要唯一的 _id 作为主键;省略时由驱动自动生成 ObjectId。绝大多数场景用 ObjectId 即可,不必硬凑自增。