insertOne()用于插入单条文档,需确保连接已建立、集合存在且文档为合法BSON对象;不支持数组或null,缺_id时自动生成,重复_id触发E11000错误,返回InsertOneResult含acknowledged和insertedId字段。

可以直接用 insertOne() 插入单条文档,但必须确保连接已建立、集合对象存在,且传入的是合法 BSON 对象 —— 否则会静默失败或抛出 MongoServerError。
insertOne() 的基本调用方式和参数要求
它只接受一个参数:document,即要插入的 JavaScript 对象(会被自动转为 BSON)。不能传数组、null、undefined 或函数。
-
document必须是普通对象(如{ name: "Alice", age: 30 }),不能是new Date()以外的特殊实例(比如moment()对象需先调用.toDate()) - 如果文档不含
_id字段,MongoDB 自动添加ObjectId;若含_id且该值已存在,会触发重复键错误E11000 duplicate key - 不支持传入
options第二个参数来控制写关注(write concern)以外的行为 —— 想设超时或确认级别,得显式传{ writeConcern: { w: "majority", wtimeout: 1000 } }
常见错误:为什么 insertOne() 看似没反应或报错?
最常遇到的不是语法错,而是上下文缺失或数据非法:
- 在未
await的异步链中调用(比如忘了await collection.insertOne(...)),导致插入被丢弃或与后续操作竞争 - 传入空对象
{}—— 虽然合法,但容易被误认为“没插进去”,其实已成功插入一个仅含_id的文档 - 字段名含点号(
.)或美元符($),如{ "user.name": "Bob" },会直接抛MongoServerError: FieldPath field names may not contain '.' - 使用了
require("mongodb").MongoClient但没调用client.connect(),此时collection.insertOne()会卡住或报Topology was destroyed
插入后如何确认是否成功?
返回值是 InsertOneResult 对象,关键字段只有两个:acknowledged 和 insertedId。别依赖 result.ops(那是旧版 driver 的用法,v4+ 已移除)。
const result = await collection.insertOne({ name: "Charlie", role: "admin" });
console.log(result.acknowledged); // true(除非 writeConcern 设为 0)
console.log(result.insertedId); // ObjectId("...")
-
acknowledged: false表示写关注设为{ w: 0 },服务端不返回确认 —— 此时无法知道是否真写入,也不触发错误 -
insertedId总是存在,即使你手动指定了_id;它和文档里的_id值一致 - 想捕获重复键等错误,必须用
try/catch包裹,错误类型是MongoServerError,其code字段为11000
真正要注意的其实是连接生命周期和文档结构合法性 —— insertOne() 本身很薄,出问题几乎都来自外围环境或数据构造环节。

















