@@ -158,9 +158,6 @@ defmodule Mongo.BulkWrite do
158
158
alias Mongo.UnorderedBulk
159
159
alias Mongo.OrderedBulk
160
160
161
- @ max_batch_size 100_000 ## todo The maxWriteBatchSize limit of a database, which indicates the maximum number of write operations permitted in a write batch, raises from 1,000 to 100,000.
162
-
163
-
164
161
@ doc """
165
162
Executes unordered and ordered bulk writes.
166
163
@@ -204,10 +201,13 @@ defmodule Mongo.BulkWrite do
204
201
insertedIds: [ ] ,
205
202
}
206
203
207
- with { :ok , conn , _ , _ } <- Mongo . select_server ( topology_pid , :write , opts ) do
204
+ with { :ok , conn , _ , _ } <- Mongo . select_server ( topology_pid , :write , opts ) ,
205
+ { :ok , limits } <- Mongo . limits ( conn ) ,
206
+ max_batch_size <- limits . max_write_batch_size do
208
207
209
- get_op_sequence ( coll , ops )
210
- |> Enum . map ( fn { cmd , docs } -> one_bulk_write_operation ( conn , cmd , coll , docs , write_concern , opts ) end )
208
+ ops
209
+ |> get_op_sequence ( )
210
+ |> Enum . map ( fn { cmd , docs } -> one_bulk_write_operation ( conn , cmd , coll , docs , write_concern , max_batch_size , opts ) end )
211
211
|> Enum . reduce ( empty , fn
212
212
{ cmd , { count , ids } } , acc -> merge ( cmd , count , ids , acc )
213
213
{ cmd , { mat , mod , ups , ids } } , acc -> merge ( cmd , mat , mod , ups , ids , acc )
@@ -258,9 +258,11 @@ defmodule Mongo.BulkWrite do
258
258
#
259
259
defp one_bulk_write ( conn , % UnorderedBulk { coll: coll , inserts: inserts , updates: updates , deletes: deletes } , write_concern , opts ) do
260
260
261
- with { _ , { inserts , ids } } <- one_bulk_write_operation ( conn , :insert , coll , inserts , write_concern , opts ) ,
262
- { _ , { matched , modified , upserts , upsert_ids } } <- one_bulk_write_operation ( conn , :update , coll , updates , write_concern , opts ) ,
263
- { _ , deletes } <- one_bulk_write_operation ( conn , :delete , coll , deletes , write_concern , opts ) do
261
+ with { :ok , limits } <- Mongo . limits ( conn ) ,
262
+ max_batch_size <- limits . max_write_batch_size ,
263
+ { _ , { inserts , ids } } <- one_bulk_write_operation ( conn , :insert , coll , inserts , write_concern , max_batch_size , opts ) ,
264
+ { _ , { matched , modified , upserts , upsert_ids } } <- one_bulk_write_operation ( conn , :update , coll , updates , write_concern , max_batch_size , opts ) ,
265
+ { _ , deletes } <- one_bulk_write_operation ( conn , :delete , coll , deletes , write_concern , max_batch_size , opts ) do
264
266
265
267
% {
266
268
acknowledged: acknowledged ( write_concern ) ,
@@ -278,18 +280,18 @@ defmodule Mongo.BulkWrite do
278
280
###
279
281
# Executes the command `cmd` and collects the result.
280
282
#
281
- defp one_bulk_write_operation ( conn , cmd , coll , docs , write_concern , opts ) do
282
- with result <- conn |> run_commands ( get_cmds ( cmd , coll , docs , write_concern , opts ) , opts ) |> collect ( cmd ) do
283
+ defp one_bulk_write_operation ( conn , cmd , coll , docs , write_concern , max_batch_size , opts ) do
284
+ with result <- conn |> run_commands ( get_cmds ( cmd , coll , docs , write_concern , max_batch_size , opts ) , opts ) |> collect ( cmd ) do
283
285
{ cmd , result }
284
286
end
285
287
end
286
288
287
289
##
288
290
# Converts the list of operations into insert/update/delete commands
289
291
#
290
- defp get_cmds ( :insert , coll , docs , write_concern , opts ) , do: get_insert_cmds ( coll , docs , write_concern , opts )
291
- defp get_cmds ( :update , coll , docs , write_concern , opts ) , do: get_update_cmds ( coll , docs , write_concern , opts )
292
- defp get_cmds ( :delete , coll , docs , write_concern , opts ) , do: get_delete_cmds ( coll , docs , write_concern , opts )
292
+ defp get_cmds ( :insert , coll , docs , write_concern , max_batch_size , opts ) , do: get_insert_cmds ( coll , docs , write_concern , max_batch_size , opts )
293
+ defp get_cmds ( :update , coll , docs , write_concern , max_batch_size , opts ) , do: get_update_cmds ( coll , docs , write_concern , max_batch_size , opts )
294
+ defp get_cmds ( :delete , coll , docs , write_concern , max_batch_size , opts ) , do: get_delete_cmds ( coll , docs , write_concern , max_batch_size , opts )
293
295
294
296
defp acknowledged ( % { w: w } ) when w > 0 , do: true
295
297
defp acknowledged ( % { } ) , do: false
@@ -299,15 +301,15 @@ defmodule Mongo.BulkWrite do
299
301
#
300
302
# [inserts, inserts, updates] -> [[inserts, inserts],[updates]]
301
303
#
302
- defp get_op_sequence ( coll , ops ) do
303
- get_op_sequence ( coll , ops , [ ] )
304
+ defp get_op_sequence ( ops ) do
305
+ get_op_sequence ( ops , [ ] )
304
306
end
305
- defp get_op_sequence ( _coll , [ ] , acc ) , do: acc
306
- defp get_op_sequence ( coll , ops , acc ) do
307
+ defp get_op_sequence ( [ ] , acc ) , do: acc
308
+ defp get_op_sequence ( ops , acc ) do
307
309
308
310
[ { kind , _doc } | _rest ] = ops
309
- { docs , rest } = find_max_sequence ( kind , ops )
310
- get_op_sequence ( coll , rest , [ { kind , docs } | acc ] )
311
+ { docs , rest } = find_max_sequence ( kind , ops )
312
+ get_op_sequence ( rest , [ { kind , docs } | acc ] )
311
313
312
314
end
313
315
@@ -371,20 +373,19 @@ defmodule Mongo.BulkWrite do
371
373
defp filter_upsert_ids ( nil ) , do: [ ]
372
374
defp filter_upsert_ids ( upserted ) , do: Enum . map ( upserted , fn doc -> doc [ "_id" ] end )
373
375
374
-
375
376
defp run_commands ( conn , { cmds , ids } , opts ) do
376
- { Enum . map ( cmds , fn cmd -> Mongo . direct_command ( conn , cmd , opts ) end ) , ids }
377
+ { Enum . map ( cmds , fn cmd -> Mongo . exec_command ( conn , cmd , opts ) end ) , ids }
377
378
end
378
379
defp run_commands ( conn , cmds , opts ) do
379
- Enum . map ( cmds , fn cmd -> Mongo . direct_command ( conn , cmd , opts ) end )
380
+ Enum . map ( cmds , fn cmd -> Mongo . exec_command ( conn , cmd , opts ) end )
380
381
end
381
382
382
- defp get_insert_cmds ( coll , docs , write_concern , _opts ) do
383
+ defp get_insert_cmds ( coll , docs , write_concern , max_batch_size , _opts ) do
383
384
384
385
{ ids , docs } = assign_ids ( docs )
385
386
386
387
cmds = docs
387
- |> Enum . chunk_every ( @ max_batch_size )
388
+ |> Enum . chunk_every ( max_batch_size )
388
389
|> Enum . map ( fn inserts -> get_insert_cmd ( coll , inserts , write_concern ) end )
389
390
{ cmds , ids }
390
391
@@ -398,10 +399,10 @@ defmodule Mongo.BulkWrite do
398
399
399
400
end
400
401
401
- defp get_delete_cmds ( coll , docs , write_concern , opts ) do
402
+ defp get_delete_cmds ( coll , docs , write_concern , max_batch_size , opts ) do
402
403
403
404
docs
404
- |> Enum . chunk_every ( @ max_batch_size )
405
+ |> Enum . chunk_every ( max_batch_size )
405
406
|> Enum . map ( fn deletes -> get_delete_cmd ( coll , deletes , write_concern , opts ) end )
406
407
407
408
end
@@ -423,10 +424,10 @@ defmodule Mongo.BulkWrite do
423
424
424
425
end
425
426
426
- defp get_update_cmds ( coll , docs , write_concern , opts ) do
427
+ defp get_update_cmds ( coll , docs , write_concern , max_batch_size , opts ) do
427
428
428
429
docs
429
- |> Enum . chunk_every ( @ max_batch_size )
430
+ |> Enum . chunk_every ( max_batch_size )
430
431
|> Enum . map ( fn updates -> get_update_cmd ( coll , updates , write_concern , opts ) end )
431
432
432
433
end
0 commit comments