参考 > 参考 > mongo Shell方法 > 收集方法 > db.collection.insertMany()
db.collection.
insertMany
()¶mongo
壳法
此页面记录了mongo
shell方法,并且
没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的
MongoDB驱动程序文档。
3.2版中的新功能。
将多个文档插入集合中。
该insertMany()
方法具有以下语法:
参数 | 类型 | 描述 |
---|---|---|
document |
文献 | 要插入到集合中的一组文档。 |
writeConcern |
文献 | 可选的。表达书面关切的文件。省略使用默认的写关注。 如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。 |
ordered |
布尔值 | 可选的。一个布尔值,指定mongod 实例应执行有序插入还是无序插入。默认为true 。 |
返回值: | 包含以下内容的文档:
|
---|
给定一个文档数组,insertMany()
将数组中的每个文档插入集合中。
默认情况下,按顺序插入文档。
如果ordered
设置为false,则文档将以无序格式插入,并且可以通过重新排序mongod
来提高性能。如果使用无序,则应用程序不应依赖于插入的顺序
insertMany()
。
每个组中的操作数不能超过maxWriteBatchSize
数据库的值。从MongoDB 3.6开始,此值为100,000
。该值显示在该isMaster.maxWriteBatchSize
字段中。
此限制可防止出现错误消息过多的问题。如果某个组超过了此数量limit
,则客户端驱动程序会将其分为计数小于或等于限制值的较小组。例如,
如果maxWriteBatchSize
值为100,000
,则如果队列包含
200,000
操作,则驱动程序将创建2个组,每个组均包含
100,000
操作。
注意
当使用高级API时,驱动程序仅将组划分为较小的组。如果直接使用 db.runCommand()(例如,在编写驱动程序时),则MongoDB在尝试执行超出限制的写批处理时会引发错误。
从MongoDB 3.6开始,一旦单个批次的错误报告变得太大,MongoDB就会将所有剩余的错误消息截断为空字符串。当前,一旦至少有2条错误消息且总大小大于,便开始1MB
。
大小和分组机制是内部性能的详细信息,将来可能会更改。
ordered
在分片集合上执行操作列表通常比执行unordered
列表要慢,
因为对于有序列表,每个操作必须等待上一个操作完成。
如果该集合不存在,则insertMany()
在成功写入时创建该集合。
_id
字段¶如果文档未指定_id字段,则mongod
添加该_id
字段并ObjectId
为文档分配唯一
。大多数驱动程序会创建一个ObjectId并插入_id
字段,但
如果驱动程序或应用程序未mongod
创建,则会创建并填充_id
。
如果文档包含一个_id
字段,则该_id
值在集合中必须唯一,以避免重复的键错误。
插入引发BulkWriteError
异常。
排除“ 写入关注”错误后,有序操作将在发生错误后停止,而无序操作将继续处理队列中所有剩余的写操作。
写关注错误显示在该writeConcernErrors
字段中,而所有其他错误显示在该writeErrors
字段中。如果遇到错误,将显示成功写入操作的次数,而不是插入的_id的列表。有序操作显示遇到的单个错误,而无序操作显示数组中的每个错误。
db.collection.insertMany()
可以在多文档交易中使用。
集合必须已经存在。事务中不允许执行会导致创建新集合的插入操作。
如果在事务中运行,则不要为操作明确设置写关注点。要对事务使用写关注,请参见 事务和写关注。
重要
在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档交易的需求。
有关其他事务使用方面的注意事项(例如运行时限制和oplog大小限制),另请参见 生产注意事项。
以下示例将文档插入products
集合中。
_id
字段¶以下示例用于db.collection.insertMany()
插入不包含该_id
字段的文档:
该操作返回以下文档:
由于文档不包含_id
,
mongod
因此_id
为每个文档创建并添加字段,并为其分配唯一ObjectId
值。
这些ObjectId
值特定于机器和运行该操作的时间。因此,您的值可能与示例中的值不同。
_id
字段的文档¶以下示例/操作用于insertMany()
插入包含该_id
字段的文档。值_id
在集合中必须唯一,以避免重复的键错误。
该操作返回以下文档:
为唯一索引(例如)的一部分的任何键插入重复值_id
会引发异常。以下尝试插入具有_id
已经存在的值的文档:
由于已经存在,因此将引发以下异常:_id: 13
请注意,已插入一个文档:的第一个文档将成功插入,但第二个插入将失败。这也将阻止插入队列中剩余的其他文档。_id: 13
使用ordered
to false
,插入操作将继续处理所有剩余文档。
以下尝试插入带有和_id
字段的
多个文档。文档数组包含两个具有重复字段的文档。ordered: false
_id
该操作引发以下异常:
尽管
由于重复值而有且文档插入失败,但
表明剩余的5个文档已插入。item: "medium box"
item: "tape"
_id
nInserted
给定一个三成员副本集,以下操作指定
w
of majority
和wtimeout
of 100
:
如果主服务器和至少一个辅助服务器在100毫秒内确认每个写操作,则返回:
如果副本集中所有必需节点确认写入操作所需的总时间大于wtimeout
,则在经过writeConcernError
该wtimeout
时间段后将显示以下内容。
该操作返回: