db.collection.insertMany()
Definition
mongo
Shell Method
This page documents the mongo
shell method, and doesnot refer to the MongoDB Node.js driver (or any other driver)method. For corresponding MongoDB driver API, refer to your specificMongoDB driver documentation instead.
New in version 3.2.
Inserts multiple documents into a collection.
The insertMany()
method has the followingsyntax:
- db.collection.insertMany(
- [ <document 1> , <document 2>, ... ],
- {
- writeConcern: <document>,
- ordered: <boolean>
- }
- )
ParameterTypeDescriptiondocument
documentAn array of documents to insert into the collection.writeConcern
documentOptional. A document expressing the write concern. Omit to use the default write concern.
Do not explicitly set the write concern for the operation if run ina transaction. To use write concern with transactions, seeTransactions and Write Concern.ordered
booleanOptional. A boolean specifying whether the mongod
instance should performan ordered or unordered insert. Defaults to true
.
Returns:A document containing:
- A boolean
acknowledged
astrue
if the operation ran withwrite concern orfalse
if write concern was disabled - An array of
_id
for each successfully inserted documents
Behaviors
Given an array of documents, insertMany()
inserts each document in the array into the collection.
Execution of Operations
By default documents are inserted in order.
If ordered
is set to false, documents are inserted in an unorderedformat and may be reordered by mongod
to increase performance.Applications should not depend on ordering of inserts if using an unorderedinsertMany()
.
The number of operations in each group cannot exceed the value ofthe maxWriteBatchSize
ofthe database. As of MongoDB 3.6, this value is 100,000
.This value is shown in the isMaster.maxWriteBatchSize
field.
This limit prevents issues with oversized error messages. If a groupexceeds this limit
,the client driver divides the group into smaller groups with countsless than or equal to the value of the limit. For example, with themaxWriteBatchSize
value of 100,000
, if the queue consists of200,000
operations, the driver creates 2 groups, each with100,000
operations.
Note
The driver only divides the group into smaller groups when usingthe high-level API. If usingdb.runCommand() directly(for example, when writing a driver), MongoDB throws an error whenattempting to execute a write batch which exceeds the limit.
Starting in MongoDB 3.6, once the error report for a single batch growstoo large, MongoDB truncates all remaining error messages to the emptystring. Currently, begins once there are at least 2 error messages withtotal size greater than 1MB
.
The sizes and grouping mechanics are internal performance details andare subject to change in future versions.
Executing an ordered
list of operations on asharded collection will generally be slower than executing anunordered
listsince with an ordered list, each operation must wait for the previousoperation to finish.
Collection Creation
If the collection does not exist, then insertMany()
creates the collection on successful write.
_id Field
If the document does not specify an _id field, then mongod
adds the _id
field and assign a uniqueObjectId
for the document. Mostdrivers create an ObjectId and insert the _id
field, but themongod
will create and populate the _id
if the driver orapplication does not.
If the document contains an _id
field, the _id
value must beunique within the collection to avoid duplicate key error.
Explainability
insertMany()
is not compatible withdb.collection.explain()
.
Use insert()
instead.
Error Handling
Inserts throw a BulkWriteError
exception.
Excluding Write Concern errors, ordered operations stopafter an error, while unordered operations continue to process anyremaining write operations in the queue.
Write concern errors are displayed in the writeConcernErrors
field, whileall other errors are displayed in the writeErrors
field. If an error isencountered, the number of successful write operations are displayed insteadof a list of inserted _ids. Ordered operations display the single errorencountered while unordered operations display each error in an array.
Transactions
db.collection.insertMany()
can be used inside multi-document transactions.
The collection must already exist. An insert operation thatwould result in the creation of a new collection are not allowed in atransaction.
Do not explicitly set the write concern for the operation if run ina transaction. To use write concern with transactions, seeTransactions and Write Concern.
Important
In most cases, multi-document transaction incurs a greaterperformance cost over single document writes, and theavailability of multi-document transactions should not be areplacement for effective schema design. For many scenarios, thedenormalized data model (embedded documents and arrays) will continue to be optimal for yourdata and use cases. That is, for many scenarios, modeling your dataappropriately will minimize the need for multi-documenttransactions.
For additional transactions usage considerations(such as runtime limit and oplog size limit), see alsoProduction Considerations.
Examples
The following examples insert documents into the products
collection.
Insert Several Document without Specifying an _id Field
The following example uses db.collection.insertMany()
to insertdocuments that do not contain the _id
field:
- try {
- db.products.insertMany( [
- { item: "card", qty: 15 },
- { item: "envelope", qty: 20 },
- { item: "stamps" , qty: 30 }
- ] );
- } catch (e) {
- print (e);
- }
The operation returns the following document:
- {
- "acknowledged" : true,
- "insertedIds" : [
- ObjectId("562a94d381cb9f1cd6eb0e1a"),
- ObjectId("562a94d381cb9f1cd6eb0e1b"),
- ObjectId("562a94d381cb9f1cd6eb0e1c")
- ]
- }
Because the documents did not include _id
,mongod
creates and adds the _id
field for each document andassigns it a unique ObjectId
value.
The ObjectId
values are specific to the machine and time when theoperation is run. As such, your values may differ from those in theexample.
Insert Several Document Specifying an _id Field
The following example/operation uses insertMany()
toinsert documents that include the _id
field. The value of _id
must beunique within the collection to avoid a duplicate key error.
- try {
- db.products.insertMany( [
- { _id: 10, item: "large box", qty: 20 },
- { _id: 11, item: "small box", qty: 55 },
- { _id: 12, item: "medium box", qty: 30 }
- ] );
- } catch (e) {
- print (e);
- }
The operation returns the following document:
- { "acknowledged" : true, "insertedIds" : [ 10, 11, 12 ] }
Inserting a duplicate value for any key that is part of a uniqueindex, such as _id
, throws an exception. The following attempts to inserta document with a _id
value that already exists:
- try {
- db.products.insertMany( [
- { _id: 13, item: "envelopes", qty: 60 },
- { _id: 13, item: "stamps", qty: 110 },
- { _id: 14, item: "packing tape", qty: 38 }
- ] );
- } catch (e) {
- print (e);
- }
Since _id: 13
already exists, the following exception is thrown:
- BulkWriteError({
- "writeErrors" : [
- {
- "index" : 0,
- "code" : 11000,
- "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 13.0 }",
- "op" : {
- "_id" : 13,
- "item" : "stamps",
- "qty" : 110
- }
- }
- ],
- "writeConcernErrors" : [ ],
- "nInserted" : 1,
- "nUpserted" : 0,
- "nMatched" : 0,
- "nModified" : 0,
- "nRemoved" : 0,
- "upserted" : [ ]
- })
Note that one document was inserted: The first document of _id: 13
willinsert successfully, but the second insert will fail. This will also stopadditional documents left in the queue from being inserted.
With ordered
to false
, the insert operation would continue with anyremaining documents.
Unordered Inserts
The following attempts to insert multiple documents with _id
field andordered: false
. The array of documents contains two documents withduplicate _id
fields.
- try {
- db.products.insertMany( [
- { _id: 10, item: "large box", qty: 20 },
- { _id: 11, item: "small box", qty: 55 },
- { _id: 11, item: "medium box", qty: 30 },
- { _id: 12, item: "envelope", qty: 100},
- { _id: 13, item: "stamps", qty: 125 },
- { _id: 13, item: "tape", qty: 20},
- { _id: 14, item: "bubble wrap", qty: 30}
- ], { ordered: false } );
- } catch (e) {
- print (e);
- }
The operation throws the following exception:
- BulkWriteError({
- "writeErrors" : [
- {
- "index" : 2,
- "code" : 11000,
- "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 11.0 }",
- "op" : {
- "_id" : 11,
- "item" : "medium box",
- "qty" : 30
- }
- },
- {
- "index" : 5,
- "code" : 11000,
- "errmsg" : "E11000 duplicate key error collection: inventory.products index: _id_ dup key: { : 13.0 }",
- "op" : {
- "_id" : 13,
- "item" : "tape",
- "qty" : 20
- }
- }
- ],
- "writeConcernErrors" : [ ],
- "nInserted" : 5,
- "nUpserted" : 0,
- "nMatched" : 0,
- "nModified" : 0,
- "nRemoved" : 0,
- "upserted" : [ ]
- })
While the document with item: "medium box"
and item: "tape"
failed to insert due to duplicate _id
values,nInserted
shows that the remaining 5 documents were inserted.
Using Write Concern
Given a three member replica set, the following operation specifies aw
of majority
and wtimeout
of 100
:
- try {
- db.products.insertMany(
- [
- { _id: 10, item: "large box", qty: 20 },
- { _id: 11, item: "small box", qty: 55 },
- { _id: 12, item: "medium box", qty: 30 }
- ],
- { w: "majority", wtimeout: 100 }
- );
- } catch (e) {
- print (e);
- }
If the primary and at least one secondary acknowledge each write operationwithin 100 milliseconds, it returns:
- {
- "acknowledged" : true,
- "insertedIds" : [
- ObjectId("562a94d381cb9f1cd6eb0e1a"),
- ObjectId("562a94d381cb9f1cd6eb0e1b"),
- ObjectId("562a94d381cb9f1cd6eb0e1c")
- ]
- }
If the total time required for all required nodes in the replica set toacknowledge the write operation is greater than wtimeout
,the following writeConcernError
is displayed when the wtimeout
periodhas passed.
This operation returns:
- WriteConcernError({
- "code" : 64,
- "errInfo" : {
- "wtimeout" : true
- },
- "errmsg" : "waiting for replication timed out"
- })