Docs 菜单

Docs 主页开发应用程序MongoDB Manual

db.collection.insert()

在此页面上

  • 定义
  • 兼容性
  • 语法
  • 行为
  • 举例
  • WriteResult
  • BulkWriteResult

重要

已弃用的 mongosh 方法

此方法在 mongosh中已弃用。有关替代方法,请参阅与旧版 mongo Shell 的兼容性更改。

db.collection.insert()

将一个或多个文档插入集合中。

返回:
  • 用于单个插入的WriteResult对象。

  • 用于批量插入的BulkWriteResult对象。

可以使用 db.collection.Insert() 查找托管在以下环境中的部署:

  • MongoDB Atlas :用于在云中部署 MongoDB 的完全托管服务

insert()方法采用以下语法:

db.collection.insert(
<document or array of documents>,
{
writeConcern: <document>,
ordered: <boolean>
}
)
范围
类型
说明
document
文档或数组
要插入到集合中的文档或文档数组。
writeConcern
文档

可选。表达写关注的文档。省略以使用默认写关注。请参阅写关注。

如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。

ordered
布尔

可选。如果为 true,则对数组中的文档执行有序插入,如果其中一个文档发生错误,MongoDB 将返回,而不处理数组中的其余文档。

如果为 false,则执行无序插入,如果其中一个文档发生错误,则继续处理数组中的其余文档。

默认值为 true

insert()返回一个包含操作状态的对象。

insert()方法使用insert命令,该命令使用默认的写关注。要指定不同的写关注,请将写关注包含在 options 参数中。

如果该集合不存在,则insert()方法将创建该集合。

如果文档没有指定 _id 字段,那么 MongoDB 将添加 _id 字段,并在插入前为文档分配唯一的 ObjectId() 字段。 大多数驱动程序都会创建一个 ObjectId 并插入 _id 字段,但如果驱动程序或应用程序没有这样做,则 mongod 将创建并填充 _id

如果文档包含 _id 字段,则 _id 值在集合中必须是唯一的,以避免重复键错误。

db.collection.insert()可以在分布式事务中使用。

重要

在大多数情况下,与单文档写入操作相比,分布式事务会产生更高的性能成本,并且分布式事务的可用性不应取代有效的模式设计。在许多情况下,非规范化数据模型(嵌入式文档和数组)仍然是数据和使用案例的最佳选择。换言之,对于许多场景,适当的数据建模将最大限度地减少对分布式事务的需求。

有关其他事务使用注意事项(如运行时间限制和 oplog 大小限制),另请参阅生产注意事项

如果事务不是跨分片写事务,则可以在分布式事务中创建集合和索引。

如果在事务中对不存在的集合指定插入操作,则 MongoDB 会隐式创建该集合。

提示

如果是在事务中运行,则请勿显式设置此操作的写关注。要将写关注与事务一起使用,请参阅事务和写关注。

如果db.collection.insert()操作成功插入文档,该操作则会在oplog (操作日志)上添加一个条目。如果操作失败,则不会在 oplog 上添加条目。

以下示例将文档插入products集合。如果该集合不存在,则insert()方法会创建该集合。

在以下示例中,传递给insert()方法的文档不包含_id字段:

db.products.insert( { item: "card", qty: 15 } )

在插入过程中,mongod 会创建 _id 字段并为其分配唯一的 ObjectId() 值,该值由插入的文档验证:

{ "_id" : ObjectId("5063114bd386d8fadbd6b004"), "item" : "card", "qty" : 15 }

ObjectId 值特定于运行操作时的设备和时间。因此,您的值可能与示例中的值不同。

在以下示例中,传递给insert()方法的文档包含_id字段。 _id的值在集合内必须是唯一的,以避免重复键错误。

db.products.insert( { _id: 10, item: "box", qty: 20 } )

该操作将以下文档插入到 products 集合中:

{ "_id" : 10, "item" : "box", "qty" : 20 }

以下示例通过将文档数组传递给insert()方法来批量插入三个文档。默认情况下,MongoDB 执行有序插入。对于有序插入,如果在插入其中一个文档期间发生错误,MongoDB 将返回错误,而不处理数组中的其余文档。

数组中的文档无需具有相同的字段。例如,数组中的第一个文档具有 _id 字段和 type 字段。由于第二和第三个文档不包含 _id 字段,因此 mongod 将在插入过程中为第二个和第三个文档创建 _id 字段:

db.products.insert(
[
{ _id: 11, item: "pencil", qty: 50, type: "no.2" },
{ item: "pen", qty: 20 },
{ item: "eraser", qty: 25 }
]
)

该操作插入了以下三个文档:

{ "_id" : 11, "item" : "pencil", "qty" : 50, "type" : "no.2" }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a0"), "item" : "pen", "qty" : 20 }
{ "_id" : ObjectId("51e0373c6f35bd826f47e9a1"), "item" : "eraser", "qty" : 25 }

以下示例无序插入三个文档。对于无序插入,如果在插入其中一个文档的过程中出现错误,MongoDB 会继续插入数组中剩余的文档。

db.products.insert(
[
{ _id: 20, item: "lamp", qty: 50, type: "desk" },
{ _id: 21, item: "lamp", qty: 20, type: "floor" },
{ _id: 22, item: "bulk", qty: 100 }
],
{ ordered: false }
)

以下对副本集的操作指定了写关注 w: 2,其 wtimeout 为 5000 毫秒。该操作要么在写操作传播到主节点和一个辅助节点后返回,要么在 5 秒后超时。

db.products.insert(
{ item: "envelopes", qty : 100, type: "Clasp" },
{ writeConcern: { w: 2, wtimeout: 5000 } }
)

传递单个文档时, insert()会返回一个WriteResult对象。

insert()返回一个包含操作状态的WriteResult()对象。成功后, WriteResult()对象将包含有关插入的文档数量的信息:

WriteResult({ "nInserted" : 1 })

如果insert()方法遇到写关注错误,结果将包括WriteResult.writeConcernError字段:

WriteResult({
"nInserted" : 1,
"writeConcernError"({
"code" : 64,
"errmsg" : "waiting for replication timed out",
"errInfo" : {
"wtimeout" : true,
"writeConcern" : {
"w" : "majority",
"wtimeout" : 100,
"provenance" : "getLastErrorDefaults"
}
}
})

提示

如果insert()方法遇到非写关注错误,结果将包括WriteResult.writeError字段:

WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.foo.$_id_ dup key: { : 1.0 }"
}
})

当传递一个文档数组时, insert()会返回一个BulkWriteResult()对象。有关详细信息,请参阅BulkWriteResult()

← db.collection.hideIndex()