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 即可,不必硬凑自增。