Definition定义
bulkWrite
New in version 8.0.8.0版本中的新功能。
Starting in MongoDB 8.0, you can use the new 从MongoDB 8.0开始,您可以使用新的bulkWrite
command to perform many insert, update, and delete operations on multiple collections in one request. bulkWrite
命令在一个请求中对多个集合执行许多插入、更新和删除操作。The existing 现有的db.collection.bulkWrite()
method only allows you to modify one collection in one request.db.collection.bulkWrite()
方法只允许您在一个请求中修改一个集合。
To specify each collection in the 要在bulkWrite
command, use a namespace (database and collection name).bulkWrite
命令中指定每个集合,请使用命名空间(数据库和集合名称)。
Compatibility兼容性
This command is available in deployments hosted in the following environments:此命令在以下环境中托管的部署中可用:
- MongoDB Atlas
: The fully managed service for MongoDB deployments in the cloud:云中MongoDB部署的完全托管服务
Note
This command is supported in all MongoDB Atlas clusters. 所有MongoDB Atlas集群都支持此命令。For information on Atlas support for all commands, see Unsupported Commands.有关Atlas支持所有命令的信息,请参阅不支持的命令。
- MongoDB Enterprise
: The subscription-based, self-managed version of MongoDB:MongoDB的基于订阅的自我管理版本 - MongoDB Community
: The source-available, free-to-use, and self-managed version of MongoDB:MongoDB的源代码可用、免费使用和自我管理版本
Syntax语法
The command has this syntax:该命令具有以下语法:
db.adminCommand( {
bulkWrite: 1,
// Include the insert, update, and delete operations in the ops array在ops数组中包括插入、更新和删除操作
ops: [
{
insert: <integer>, // Namespace ID index for insert operation.插入操作的命名空间ID索引。
// Must match a namespace ID index in ns specified later in the nsInfo array.必须与nsInfo数组中稍后指定的ns中的命名空间ID索引匹配。
document: <document>
},
{
update: <integer>, // Namespace ID index for update operation更新操作的命名空间ID索引
filter: <document>,
updateMods: <document>,
arrayFilters: [ <filterDocument0>, <filterDocument1>, ... ],
multi: <bolean>,
hint: <document>,
constants: <document>,
collation: <document>
},
{
delete: <integer>, // Namespace ID index for delete operation删除操作的命名空间ID索引
filter: <document>,
multi: <boolean>,
hint: <document>,
collation: <document>
},
...
// Additional insert, update, and delete operations in any order以任何顺序执行其他插入、更新和删除操作
...
],
// Include the namespaces with collections to modify in the nsInfo array. 在nsInfo数组中包含要修改集合的命名空间。You can add multiple namespaces here.您可以在此处添加多个命名空间。
nsInfo: [
{
ns: <string>, // Namespace (database and collection name) to modify.要修改的命名空间(数据库和集合名称)。
// Each operation namespace ID index specified in the earlier ops array must match a namespace ID index here.在前面的ops数组中指定的每个操作命名空间ID索引都必须与此处的命名空间ID索引匹配。
collectionUUID: <string>,
encryptionInformation: <document>
},
...
// Additional namespaces其他命名空间
...
],
// Additional fields其他字段
ordered: <boolean>,
bypassDocumentValidation: <boolean>,
comment: <string>,
let: <document>,
errorsOnly: <boolean>,
cursor: { batchSize: <integer> },
writeConcern: <string>
} )
In the command syntax, you can specify multiple:在命令语法中,可以指定多个:
Insert, update, and delete operations in any order in the在ops
array.ops
数组中以任何顺序插入、更新和删除操作。Namespaces for the operations in thensInfo
array.nsInfo
数组中操作的命名空间。To match the operation to the namespace, use the same namespace ID index. Indexes start at要将操作与命名空间匹配,请使用相同的命名空间ID索引。索引从0
.0
开始。You can use sharded collections.您可以使用分片集合。
Command Fields命令字段
The command takes the following fields:该命令包含以下字段:
insert | integer | ns field in the nsInfo array. Indexes start at 0 .nsInfo 数组中ns 字段中的命名空间ID指数匹配。索引从0 开始。 | |
document | document | ||
update | integer | ns field in the nsInfo array. Indexes start at 0 .nsInfo 数组中ns 字段中的命名空间ID指数匹配。索引从0 开始。 | |
filter | document | Query selector to limit the documents for the update or delete operation. | |
updateMods | document |
| |
arrayFilters | document array | arrayFilters .arrayFilters 的数组更新操作。 | |
multi | boolean | If the multi field is true , the update or delete operation updates or deletes all documents that match the document filter . If false , the operation updates or deletes the first document that matches the document filter . For details on multi-document transactions, see Transactions.
Default is | |
hint | document | filter . | |
constants | document | Constants for an aggregation pipeline custom update. | |
collation | document | Collation for an update or delete operation. | |
delete | integer | Namespace ID index for a delete operation, which must match a namespace ID index in the ns field in the nsInfo array. Indexes start at 0 . | |
ns | string | Namespace (database and collection) for the operations. Set the namespace ID index for each operation in ops to the matching namespace array index in ns . Indexes start at 0 . | |
collectionUUID | string | UUID hexadecimal value that specifies the collection for the operations. | |
encryptionInformation | document | Encryption information schema and tokens for the operation. For details, see Encryption Schemas. | |
ordered | boolean | If true , perform ordered operations. Otherwise, perform unordered operations.
Default is | |
bypassDocumentValidation | boolean | If true , the operation bypasses the schema validation rules. If false , the documents must be valid.
Default is | |
comment | string |
A comment can be any valid BSON type (string, integer, object, array, etc). | |
let | document | Document with a list of constants to reference in the operation. For let examples, see Use Variables in let Option or c Field and Use Variables in let . | |
errorsOnly | boolean | If true , the operation only returns errors and omits other output.
Default is | |
cursor batchSize | integer | Cursor batch size for the bulkWrite command's returned results. For details, see cursor.batchSize() . | |
writeConcern | string |
Output输出
The command returns a document with these fields:该命令返回一个包含以下字段的文档:
cursor | document | |
cursor.id | integer | |
cursor.firstBatch | document array | |
cursor.firstBatch.ok | integer | 1 indicates the operation was successful. Otherwise, 0 .1 表示操作成功。否则,0 。 |
cursor.firstBatch.idx | integer | ops array. The first operation has an idx value of 0 .ops 数组中的操作相对应。第一个操作的idx 值为0 。 |
cursor.firstBatch.code | integer | |
cursor.firstBatch.errmsg | string | |
cursor.firstBatch.keyPattern | document | |
cursor.firstBatch.keyValue | document | |
cursor.firstBatch.n | integer | |
cursor.firstBatch.nModified | integer | |
nErrors | integer | bulkWrite command.bulkWrite 命令的错误数。 |
nInserted | integer | |
nMatched | integer | |
nModified | integer | |
nUpserted | integer | |
nDeleted | integer | |
ok | integer | 1 indicates the bulkWrite command was successful. Otherwise, 0 . |
Note
The output fields may vary depending on the operations you run in the 输出字段可能因您在bulkWrite
command.bulkWrite
命令中运行的操作而异。
Behavior行为
This section describes the 本节介绍bulkWrite
command behavior.bulkWrite
命令行为。
Multiple Document Field and Retryable Writes多个文档字段和可重试写入
If the multi
field is true
, the update or delete operation updates or deletes all documents that match the document filter
. If false
, the operation updates or deletes the first document that matches the document filter
. For details on multi-document transactions, see Transactions.
To enable retryable writes, see retryable writes.要启用可重试写入,请参阅可重试写入。
You can use 您可以将bulkWrite
insert operations with retryable writes and the multi
field set to true
.bulkWrite
插入操作与可重试的写入操作一起使用,并将multi
字段设置为true
。
You can use bulkWrite
update and delete operations with the multi
field set to true
. But, you cannot use update or delete operations with both multi
set to true
and retryable writes.
Write Concern Errors in Sharded Clusters分片集群中的写入关注错误
Changed in version 8.1.2.
When bulkWrite
executes on mongos
in a sharded cluster, a writeConcernError
is always reported in the response, even when one or more other errors occur. In previous releases, other errors sometimes caused bulkWrite
to not report write concern errors.
For example, if a document fails validation, triggering a DocumentValidationFailed
error, and a write concern error also occurs, both the DocumentValidationFailed
error and the writeConcernError
are returned in the top-level field of the response.
Operation Performance
If you rewrite existing insert, update, and delete commands as a bulkWrite
command and set errorsOnly
to true
, the bulkWrite
command has similar performance as the existing commands. If you set errorsOnly
to false
, performance is worse.
In addition, if you have a sequence of commands like this:
insert
update
delete
If you replace those commands with the following example fragment, then the command with the following fragment is faster regardless of other options:
{
bulkWrite: 1,
ops: [
insert,
update,
delete
]
}
Most of the performance improvement is because of network latency, which is variable depending on your implementation, but the example is always faster.大多数性能改进是由于网络延迟,网络延迟因您的实现而异,但示例总是更快。
Examples例子
This section contains 本节包含bulkWrite
command examples.bulkWrite
命令示例。
Single Namespace Bulk Write Example
The following bulkWrite
example modifies a single namespace:
Create the pizzas example collection创建披萨示例集合
Run:
db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )
Modify the pizzas example collection
Run the following bulkWrite
command to perform insert, update, and delete operations on the pizzas
collection:
db.adminCommand( {
bulkWrite: 1,
// The ops array contains the insert, update, and delete
// operations.
ops: [
// Specify the namespace ID index immediately after
// the insert, update, and delete text.
// For example, "insert: 0" specifies the 0 namespace ID index,
// which is the "test.pizzas" namespace in nsInfo at the end
// of the example.
// Insert a pizza.
{ insert: 0, document: { _id: 4, type: "sausage",
size: "small", price: 12 } },
// Update the price for medium pizzas.
{ update: 0, filter: { size: "medium" },
updateMods: { $set: { price: 15 } } },
// Delete the pizza with an _id of 2.
{ delete: 0, filter: { _id: 2 } }
],
// The nsInfo array contains the namespace to apply the
// previous operations to.
nsInfo: [
{ ns: "test.pizzas" } // Namespace ID index is 0.
]
} )
The pizzas
collection is in the default test
database, so the ns
namespace is "test.pizzas"
. The namespace ID index is 0
, which is set in the first field of the insert, update, and delete operations in the ops
array.
Examine the output检查输出
The following 以下bulkWrite
example output, with various ok: 1
fields and nErrors: 0
, indicates all operations were successful:bulkWrite
示例输出,带有各种ok: 1
字段和nErrors: 0
,表示所有操作都成功:
{
cursor: {
id: Long('0'),
firstBatch: [
{ ok: 1, idx: 0, n: 1 },
{ ok: 1, idx: 1, n: 1, nModified: 1 },
{ ok: 1, idx: 2, n: 1 }
],
ns: 'admin.$cmd.bulkWrite'
},
nErrors: 0,
nInserted: 1,
nMatched: 1,
nModified: 1,
nUpserted: 0,
nDeleted: 1,
ok: 1
}
For details about the output fields, see the earlier Output section.
Multiple Namespaces Bulk Write Example多命名空间批量写入示例
You can specify multiple namespaces in a 您可以在bulkWrite
command.bulkWrite
命令中指定多个命名空间。
The following 以下bulkWrite
example contains insert, update, and delete operations for two namespaces:bulkWrite
示例包含两个命名空间的插入、更新和删除操作:
Create the pizzas example collection创建披萨示例集合
If you already have the pizzas
collection in your test
database, use the db.collection.drop()
method to drop it first and then run:
db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )
Create the pizza orders example collection
Run:
db.pizzaOrders.insertMany( [
{ _id: 0, type: "pepperoni", number: 5,
orderDate: new Date( "2023-01-15T12:00:00Z" ) },
{ _id: 1, type: "cheese", number: 15,
orderDate: new Date( "2023-01-23T11:12:32Z" ) },
{ _id: 2, type: "vegan", number: 20,
orderDate: new Date( "2023-03-20T10:01:12Z" ) }
] )
Modify the example collections修改示例集合
Run the following 运行以下bulkWrite
command to perform insert, update, and delete operations on the example collections:bulkWrite
命令,对示例集合执行插入、更新和删除操作:
db.adminCommand( {
bulkWrite: 1,
// The ops array contains the insert, update, and delete
// operations.
ops: [
// Specify the namespace ID indexes immediately after
// the insert, update, and delete. For example, "insert: 0"
// specifies the 0 namespace ID index, which is the "test.pizzas"
// namespace. And, "insert: 1" specifies "test.pizzaOrders".
// Insert pizzas.
// Namespace ID is 0 for "test.pizzas", which
// is specified as "insert: 0".
{ insert: 0, document: { _id: 5, type: "sausage",
size: "small", price: 12 } },
{ insert: 0, document: { _id: 6, type: "vegan cheese",
size: "large", price: 25 } },
// Update the price for cheese pizzas.
{ update: 0, filter: { type: "cheese" },
updateMods: { $set: { price: 15 } } },
// Delete pizzas with a price less than 7.
{ delete: 0, filter: { price: { $lt: 7 } } },
// Insert pizza orders.
// Namespace ID is 1 for "test.pizzaOrders".
{ insert: 1, document: { _id: 3, type: "sausage", number: 7,
orderDate: new Date( "2023-04-15T12:02:15Z" ) } },
{ insert: 1, document: { _id: 4, type: "vegan", number: 16,
orderDate: new Date( "2023-05-12T11:03:11Z" ) } },
// Update the number of pizza orders for cheese pizzas.
{ update: 1, filter: { type: "cheese" },
updateMods: { $set: { number: 50 } } },
// Delete the pizza order with an _id of 2.
{ delete: 1, filter: { _id: 2 } },
// Delete pizza orders placed before March 15, 2023.
{ delete: 1, filter: { orderDate:
{ $lte: ISODate( "2023-03-15T00:00:00Z" ) } } }
],
// Namespaces
nsInfo: [
{ ns: "test.pizzas" }, // Namespace ID index is 0.
{ ns: "test.pizzaOrders" } // Namespace ID index is 1.
]
} )
Examine the output
The following bulkWrite
example output indicates the operations were successful:
{
cursor: {
id: Long('0'),
firstBatch: [
{ ok: 1, idx: 0, n: 1 },
{ ok: 1, idx: 1, n: 1 },
{ ok: 1, idx: 2, n: 1, nModified: 1 },
{ ok: 1, idx: 3, n: 1 },
{ ok: 1, idx: 4, n: 1 },
{ ok: 1, idx: 5, n: 1 },
{ ok: 1, idx: 6, n: 1, nModified: 1 },
{ ok: 1, idx: 7, n: 1 },
{ ok: 1, idx: 8, n: 1 }
],
ns: 'admin.$cmd.bulkWrite'
},
nErrors: 0,
nInserted: 4,
nMatched: 2,
nModified: 2,
nUpserted: 0,
nDeleted: 3,
ok: 1
}
Operations with Errors Bulk Write Example
The following bulkWrite
example contains operations with errors and operations that don't change any documents:
Create the pizzas example collection
If you already have the pizzas
collection in your test
database, use the db.collection.drop()
method to drop it first and then run:
db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )
Attempt to modify the pizzas example collection
Run the following bulkWrite
command to perform insert, update, and delete operations on the pizzas
collection:
db.adminCommand( {
bulkWrite: 1,
// The ops array contains the insert, update, and delete
// operations.
ops: [
// The namespace ID indexes are specified immediately after
// the insert, update, and delete text.
// For example, "insert: 0" specifies the 0 namespace ID index,
// which is the "test.pizzas" namespace in nsInfo.
// Attempt to add a duplicate document with an
// _id of 1, which already exists and causes an error.
{ insert: 0, document: { _id: 1, type: "tomato",
size: "small", price: 12 } },
// Attempt to add another duplicate document.
{ insert: 0, document: { _id: 2, type: "pepper",
size: "small", price: 12 } },
// Attempt to change the price for extra large pizzas,
// which don't exist. This doesn't cause an error but
// doesn't update any documents.
{ update: 0, filter: { size: "extra large" },
updateMods: { $set: { price: 15 } } },
// Attempt to remove a document that doesn't exist.
// This doesn't cause an error but doesn't delete any documents.
{ delete: 0, filter: { _id: 8 } }
],
// The nsInfo array contains the namespace to apply the
// previous operations to.
nsInfo: [
{ ns: "test.pizzas" } // Namespace ID index is 0.
],
// Set the ordered field to false to run the remaining operations
// after an operation returns an error.
ordered: false
} )
Examine the output
The following bulkWrite
example output shows the errors:
{
cursor: {
id: Long("0"),
firstBatch: [
{
ok: 0,
idx: 0,
code: 11000,
errmsg: 'E11000 duplicate key error collection:
test.pizzas index: _id_ dup key: { _id: 1 }',
keyPattern: { _id: 1 },
keyValue: { _id: 1 },
n: 0
},
{
ok: 0,
idx: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection:
test.pizzas index: _id_ dup key: { _id: 2 }',
keyPattern: { _id: 1 },
keyValue: { _id: 2 },
n: 0
},
{ ok: 1, idx: 2, n: 0, nModified: 0 },
{ ok: 1, idx: 3, n: 0 }
],
ns: 'admin.$cmd.bulkWrite'
},
nErrors: 2,
nInserted: 0,
nMatched: 0,
nModified: 0,
nUpserted: 0,
nDeleted: 0,
ok: 1
}
For details about the output fields, including the error codes and messages, see the earlier Output section.有关输出字段的详细信息,包括错误代码和消息,请参阅前面的输出部分。
Bulk Write Example with errorsOnly Enabled带错误的批量写入示例仅启用
The following 以下bulkWrite
example sets errorsOnly
to true
to only show the error output:bulkWrite
示例将errorsOnly
设置为true
,仅显示错误输出:
Create the pizzas example collection创建披萨示例集合
If you already have the pizzas
collection in your test
database, use the db.collection.drop()
method to drop it first and then run:
db.pizzas.insertMany( [
{ _id: 0, type: "pepperoni", size: "small", price: 4 },
{ _id: 1, type: "cheese", size: "medium", price: 7 },
{ _id: 2, type: "vegan", size: "large", price: 8 }
] )
Attempt to modify the pizzas example collection
Run the following bulkWrite
command to perform insert, update, and delete operations on the pizzas
collection with errorsOnly
set to true
:
db.adminCommand( {
bulkWrite: 1,
// The ops array contains the insert, update, and delete
// operations.
ops: [
// The namespace ID indexes are specified immediately after
// the insert, update, and delete text.
// For example, "insert: 0" specifies the 0 namespace ID index,
// which is the "test.pizzas" namespace in nsInfo.
// Attempt to add a duplicate document with an
// _id of 1, which already exists and causes an error.
{ insert: 0, document: { _id: 1, type: "tomato",
size: "small", price: 12 } },
// Attempt to add another duplicate document.
{ insert: 0, document: { _id: 2, type: "pepper",
size: "small", price: 12 } },
// Attempt to change the price for extra large pizzas,
// which don't exist. This doesn't cause an error but
// doesn't update any documents.
{ update: 0, filter: { size: "extra large" },
updateMods: { $set: { price: 15 } } },
// Attempt to remove a document that doesn't exist.
// This doesn't cause an error but doesn't delete any documents.
{ delete: 0, filter: { _id: 8 } }
],
// The nsInfo array contains the namespace to apply the
// previous operations to.
nsInfo: [
{ ns: "test.pizzas" } // Namespace ID index is 0.
],
// Set the ordered field to false to run the remaining operations
// after an operation returns an error.
ordered: false,
// Set the errorsOnly field to true to only output the errors.
errorsOnly: true
} )
Examine the output
The following bulkWrite
example output shows the errors:
{
cursor: {
id: Long("0"),
firstBatch: [
{
ok: 0,
idx: 0,
code: 11000,
errmsg: 'E11000 duplicate key error collection:
test.pizzas index: _id_ dup key: { _id: 1 }',
keyPattern: { _id: 1 },
keyValue: { _id: 1 },
n: 0
},
{
ok: 0,
idx: 1,
code: 11000,
errmsg: 'E11000 duplicate key error collection:
test.pizzas index: _id_ dup key: { _id: 2 }',
keyPattern: { _id: 1 },
keyValue: { _id: 2 },
n: 0
},
],
ns: 'admin.$cmd.bulkWrite'
},
nErrors: 2,
nInserted: 0,
nMatched: 0,
nModified: 0,
nUpserted: 0,
nDeleted: 0,
ok: 1
}