1MONGOC_BULK(3) libmongoc MONGOC_BULK(3)
2
3
4
6 mongoc_bulk - Bulk Write Operations
7
8 This tutorial explains how to take advantage of MongoDB C driver bulk
9 write operation features. Executing write operations in batches reduces
10 the number of network round trips, increasing write throughput.
11
13 First we need to fetch a bulk operation handle from the
14 mongoc_collection_t.
15
16 mongoc_bulk_operation_t *bulk =
17 mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
18
19 We can now start inserting documents to the bulk operation. These will
20 be buffered until we execute the operation.
21
22 The bulk operation will coalesce insertions as a single batch for each
23 consecutive call to mongoc_bulk_operation_insert(). This creates a
24 pipelined effect when possible.
25
26 To execute the bulk operation and receive the result we call
27 mongoc_bulk_operation_execute().
28
29 bulk1.c
30
31 #include <assert.h>
32 #include <mongoc/mongoc.h>
33 #include <stdio.h>
34
35 static void
36 bulk1 (mongoc_collection_t *collection)
37 {
38 mongoc_bulk_operation_t *bulk;
39 bson_error_t error;
40 bson_t *doc;
41 bson_t reply;
42 char *str;
43 bool ret;
44 int i;
45
46 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
47
48 for (i = 0; i < 10000; i++) {
49 doc = BCON_NEW ("i", BCON_INT32 (i));
50 mongoc_bulk_operation_insert (bulk, doc);
51 bson_destroy (doc);
52 }
53
54 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
55
56 str = bson_as_canonical_extended_json (&reply, NULL);
57 printf ("%s\n", str);
58 bson_free (str);
59
60 if (!ret) {
61 fprintf (stderr, "Error: %s\n", error.message);
62 }
63
64 bson_destroy (&reply);
65 mongoc_bulk_operation_destroy (bulk);
66 }
67
68 int
69 main (void)
70 {
71 mongoc_client_t *client;
72 mongoc_collection_t *collection;
73 const char *uri_string = "mongodb://localhost/?appname=bulk1-example";
74 mongoc_uri_t *uri;
75 bson_error_t error;
76
77 mongoc_init ();
78
79 uri = mongoc_uri_new_with_error (uri_string, &error);
80 if (!uri) {
81 fprintf (stderr,
82 "failed to parse URI: %s\n"
83 "error message: %s\n",
84 uri_string,
85 error.message);
86 return EXIT_FAILURE;
87 }
88
89 client = mongoc_client_new_from_uri (uri);
90 if (!client) {
91 return EXIT_FAILURE;
92 }
93
94 mongoc_client_set_error_api (client, 2);
95 collection = mongoc_client_get_collection (client, "test", "test");
96
97 bulk1 (collection);
98
99 mongoc_uri_destroy (uri);
100 mongoc_collection_destroy (collection);
101 mongoc_client_destroy (client);
102
103 mongoc_cleanup ();
104
105 return EXIT_SUCCESS;
106 }
107
108
109 Example reply document:
110
111 {"nInserted" : 10000,
112 "nMatched" : 0,
113 "nModified" : 0,
114 "nRemoved" : 0,
115 "nUpserted" : 0,
116 "writeErrors" : []
117 "writeConcernErrors" : [] }
118
120 MongoDB C driver also supports executing mixed bulk write operations. A
121 batch of insert, update, and remove operations can be executed together
122 using the bulk write operations API.
123
125 Ordered bulk write operations are batched and sent to the server in the
126 order provided for serial execution. The reply document describes the
127 type and count of operations performed.
128
129 bulk2.c
130
131 #include <assert.h>
132 #include <mongoc/mongoc.h>
133 #include <stdio.h>
134
135 static void
136 bulk2 (mongoc_collection_t *collection)
137 {
138 mongoc_bulk_operation_t *bulk;
139 bson_error_t error;
140 bson_t *query;
141 bson_t *doc;
142 bson_t *opts;
143 bson_t reply;
144 char *str;
145 bool ret;
146 int i;
147
148 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
149
150 /* Remove everything */
151 query = bson_new ();
152 mongoc_bulk_operation_remove (bulk, query);
153 bson_destroy (query);
154
155 /* Add a few documents */
156 for (i = 1; i < 4; i++) {
157 doc = BCON_NEW ("_id", BCON_INT32 (i));
158 mongoc_bulk_operation_insert (bulk, doc);
159 bson_destroy (doc);
160 }
161
162 /* {_id: 1} => {$set: {foo: "bar"}} */
163 query = BCON_NEW ("_id", BCON_INT32 (1));
164 doc = BCON_NEW ("$set", "{", "foo", BCON_UTF8 ("bar"), "}");
165 mongoc_bulk_operation_update_many_with_opts (bulk, query, doc, NULL, &error);
166 bson_destroy (query);
167 bson_destroy (doc);
168
169 /* {_id: 4} => {'$inc': {'j': 1}} (upsert) */
170 opts = BCON_NEW ("upsert", BCON_BOOL (true));
171 query = BCON_NEW ("_id", BCON_INT32 (4));
172 doc = BCON_NEW ("$inc", "{", "j", BCON_INT32 (1), "}");
173 mongoc_bulk_operation_update_many_with_opts (bulk, query, doc, opts, &error);
174 bson_destroy (query);
175 bson_destroy (doc);
176 bson_destroy (opts);
177
178 /* replace {j:1} with {j:2} */
179 query = BCON_NEW ("j", BCON_INT32 (1));
180 doc = BCON_NEW ("j", BCON_INT32 (2));
181 mongoc_bulk_operation_replace_one_with_opts (bulk, query, doc, NULL, &error);
182 bson_destroy (query);
183 bson_destroy (doc);
184
185 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
186
187 str = bson_as_canonical_extended_json (&reply, NULL);
188 printf ("%s\n", str);
189 bson_free (str);
190
191 if (!ret) {
192 printf ("Error: %s\n", error.message);
193 }
194
195 bson_destroy (&reply);
196 mongoc_bulk_operation_destroy (bulk);
197 }
198
199 int
200 main (void)
201 {
202 mongoc_client_t *client;
203 mongoc_collection_t *collection;
204 const char *uri_string = "mongodb://localhost/?appname=bulk2-example";
205 mongoc_uri_t *uri;
206 bson_error_t error;
207
208 mongoc_init ();
209
210 uri = mongoc_uri_new_with_error (uri_string, &error);
211 if (!uri) {
212 fprintf (stderr,
213 "failed to parse URI: %s\n"
214 "error message: %s\n",
215 uri_string,
216 error.message);
217 return EXIT_FAILURE;
218 }
219
220 client = mongoc_client_new_from_uri (uri);
221 if (!client) {
222 return EXIT_FAILURE;
223 }
224
225 mongoc_client_set_error_api (client, 2);
226 collection = mongoc_client_get_collection (client, "test", "test");
227
228 bulk2 (collection);
229
230 mongoc_uri_destroy (uri);
231 mongoc_collection_destroy (collection);
232 mongoc_client_destroy (client);
233
234 mongoc_cleanup ();
235
236 return EXIT_SUCCESS;
237 }
238
239
240 Example reply document:
241
242 { "nInserted" : 3,
243 "nMatched" : 2,
244 "nModified" : 2,
245 "nRemoved" : 10000,
246 "nUpserted" : 1,
247 "upserted" : [{"index" : 5, "_id" : 4}],
248 "writeErrors" : []
249 "writeConcernErrors" : [] }
250
251 The index field in the upserted array is the 0-based index of the up‐
252 sert operation; in this example, the sixth operation of the overall
253 bulk operation was an upsert, so its index is 5.
254
256 Unordered bulk write operations are batched and sent to the server in
257 arbitrary order where they may be executed in parallel. Any errors that
258 occur are reported after all operations are attempted.
259
260 In the next example the first and third operations fail due to the
261 unique constraint on _id. Since we are doing unordered execution the
262 second and fourth operations succeed.
263
264 bulk3.c
265
266 #include <assert.h>
267 #include <mongoc/mongoc.h>
268 #include <stdio.h>
269
270 static void
271 bulk3 (mongoc_collection_t *collection)
272 {
273 bson_t opts = BSON_INITIALIZER;
274 mongoc_bulk_operation_t *bulk;
275 bson_error_t error;
276 bson_t *query;
277 bson_t *doc;
278 bson_t reply;
279 char *str;
280 bool ret;
281
282 /* false indicates unordered */
283 BSON_APPEND_BOOL (&opts, "ordered", false);
284 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, &opts);
285 bson_destroy (&opts);
286
287 /* Add a document */
288 doc = BCON_NEW ("_id", BCON_INT32 (1));
289 mongoc_bulk_operation_insert (bulk, doc);
290 bson_destroy (doc);
291
292 /* remove {_id: 2} */
293 query = BCON_NEW ("_id", BCON_INT32 (2));
294 mongoc_bulk_operation_remove_one (bulk, query);
295 bson_destroy (query);
296
297 /* insert {_id: 3} */
298 doc = BCON_NEW ("_id", BCON_INT32 (3));
299 mongoc_bulk_operation_insert (bulk, doc);
300 bson_destroy (doc);
301
302 /* replace {_id:4} {'i': 1} */
303 query = BCON_NEW ("_id", BCON_INT32 (4));
304 doc = BCON_NEW ("i", BCON_INT32 (1));
305 mongoc_bulk_operation_replace_one (bulk, query, doc, false);
306 bson_destroy (query);
307 bson_destroy (doc);
308
309 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
310
311 str = bson_as_canonical_extended_json (&reply, NULL);
312 printf ("%s\n", str);
313 bson_free (str);
314
315 if (!ret) {
316 printf ("Error: %s\n", error.message);
317 }
318
319 bson_destroy (&reply);
320 mongoc_bulk_operation_destroy (bulk);
321 bson_destroy (&opts);
322 }
323
324 int
325 main (void)
326 {
327 mongoc_client_t *client;
328 mongoc_collection_t *collection;
329 const char *uri_string = "mongodb://localhost/?appname=bulk3-example";
330 mongoc_uri_t *uri;
331 bson_error_t error;
332
333 mongoc_init ();
334
335 uri = mongoc_uri_new_with_error (uri_string, &error);
336 if (!uri) {
337 fprintf (stderr,
338 "failed to parse URI: %s\n"
339 "error message: %s\n",
340 uri_string,
341 error.message);
342 return EXIT_FAILURE;
343 }
344
345 client = mongoc_client_new_from_uri (uri);
346 if (!client) {
347 return EXIT_FAILURE;
348 }
349
350 mongoc_client_set_error_api (client, 2);
351 collection = mongoc_client_get_collection (client, "test", "test");
352
353 bulk3 (collection);
354
355 mongoc_uri_destroy (uri);
356 mongoc_collection_destroy (collection);
357 mongoc_client_destroy (client);
358
359 mongoc_cleanup ();
360
361 return EXIT_SUCCESS;
362 }
363
364
365 Example reply document:
366
367 { "nInserted" : 0,
368 "nMatched" : 1,
369 "nModified" : 1,
370 "nRemoved" : 1,
371 "nUpserted" : 0,
372 "writeErrors" : [
373 { "index" : 0,
374 "code" : 11000,
375 "errmsg" : "E11000 duplicate key error index: test.test.$_id_ dup key: { : 1 }" },
376 { "index" : 2,
377 "code" : 11000,
378 "errmsg" : "E11000 duplicate key error index: test.test.$_id_ dup key: { : 3 }" } ],
379 "writeConcernErrors" : [] }
380
381 Error: E11000 duplicate key error index: test.test.$_id_ dup key: { : 1 }
382
383 The bson_error_t domain is MONGOC_ERROR_COMMAND and its code is 11000.
384
386 This feature is only available when using MongoDB 3.2 and later.
387
388 By default bulk operations are validated against the schema, if any is
389 defined. In certain cases however it may be necessary to bypass the
390 document validation.
391
392 bulk5.c
393
394 #include <assert.h>
395 #include <mongoc/mongoc.h>
396 #include <stdio.h>
397
398 static void
399 bulk5_fail (mongoc_collection_t *collection)
400 {
401 mongoc_bulk_operation_t *bulk;
402 bson_error_t error;
403 bson_t *doc;
404 bson_t reply;
405 char *str;
406 bool ret;
407
408 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
409
410 /* Two inserts */
411 doc = BCON_NEW ("_id", BCON_INT32 (31));
412 mongoc_bulk_operation_insert (bulk, doc);
413 bson_destroy (doc);
414
415 doc = BCON_NEW ("_id", BCON_INT32 (32));
416 mongoc_bulk_operation_insert (bulk, doc);
417 bson_destroy (doc);
418
419 /* The above documents do not comply to the schema validation rules
420 * we created previously, so this will result in an error */
421 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
422
423 str = bson_as_canonical_extended_json (&reply, NULL);
424 printf ("%s\n", str);
425 bson_free (str);
426
427 if (!ret) {
428 printf ("Error: %s\n", error.message);
429 }
430
431 bson_destroy (&reply);
432 mongoc_bulk_operation_destroy (bulk);
433 }
434
435 static void
436 bulk5_success (mongoc_collection_t *collection)
437 {
438 mongoc_bulk_operation_t *bulk;
439 bson_error_t error;
440 bson_t *doc;
441 bson_t reply;
442 char *str;
443 bool ret;
444
445 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
446
447 /* Allow this document to bypass document validation.
448 * NOTE: When authentication is enabled, the authenticated user must have
449 * either the "dbadmin" or "restore" roles to bypass document validation */
450 mongoc_bulk_operation_set_bypass_document_validation (bulk, true);
451
452 /* Two inserts */
453 doc = BCON_NEW ("_id", BCON_INT32 (31));
454 mongoc_bulk_operation_insert (bulk, doc);
455 bson_destroy (doc);
456
457 doc = BCON_NEW ("_id", BCON_INT32 (32));
458 mongoc_bulk_operation_insert (bulk, doc);
459 bson_destroy (doc);
460
461 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
462
463 str = bson_as_canonical_extended_json (&reply, NULL);
464 printf ("%s\n", str);
465 bson_free (str);
466
467 if (!ret) {
468 printf ("Error: %s\n", error.message);
469 }
470
471 bson_destroy (&reply);
472 mongoc_bulk_operation_destroy (bulk);
473 }
474
475 int
476 main (void)
477 {
478 bson_t *options;
479 bson_error_t error;
480 mongoc_client_t *client;
481 mongoc_collection_t *collection;
482 mongoc_database_t *database;
483 const char *uri_string = "mongodb://localhost/?appname=bulk5-example";
484 mongoc_uri_t *uri;
485
486 mongoc_init ();
487
488 uri = mongoc_uri_new_with_error (uri_string, &error);
489 if (!uri) {
490 fprintf (stderr,
491 "failed to parse URI: %s\n"
492 "error message: %s\n",
493 uri_string,
494 error.message);
495 return EXIT_FAILURE;
496 }
497
498 client = mongoc_client_new_from_uri (uri);
499 if (!client) {
500 return EXIT_FAILURE;
501 }
502
503 mongoc_client_set_error_api (client, 2);
504 database = mongoc_client_get_database (client, "testasdf");
505
506 /* Create schema validator */
507 options = BCON_NEW (
508 "validator", "{", "number", "{", "$gte", BCON_INT32 (5), "}", "}");
509 collection =
510 mongoc_database_create_collection (database, "collname", options, &error);
511
512 if (collection) {
513 bulk5_fail (collection);
514 bulk5_success (collection);
515 mongoc_collection_destroy (collection);
516 } else {
517 fprintf (stderr, "Couldn't create collection: '%s'\n", error.message);
518 }
519
520 bson_free (options);
521 mongoc_uri_destroy (uri);
522 mongoc_database_destroy (database);
523 mongoc_client_destroy (client);
524
525 mongoc_cleanup ();
526
527 return EXIT_SUCCESS;
528 }
529
530
531 Running the above example will result in:
532
533 { "nInserted" : 0,
534 "nMatched" : 0,
535 "nModified" : 0,
536 "nRemoved" : 0,
537 "nUpserted" : 0,
538 "writeErrors" : [
539 { "index" : 0,
540 "code" : 121,
541 "errmsg" : "Document failed validation" } ] }
542
543 Error: Document failed validation
544
545 { "nInserted" : 2,
546 "nMatched" : 0,
547 "nModified" : 0,
548 "nRemoved" : 0,
549 "nUpserted" : 0,
550 "writeErrors" : [] }
551
552 The bson_error_t domain is MONGOC_ERROR_COMMAND.
553
555 By default bulk operations are executed with the write_concern of the
556 collection they are executed against. A custom write concern can be
557 passed to the mongoc_collection_create_bulk_operation_with_opts()
558 method. Write concern errors (e.g. wtimeout) will be reported after all
559 operations are attempted, regardless of execution order.
560
561 bulk4.c
562
563 #include <assert.h>
564 #include <mongoc/mongoc.h>
565 #include <stdio.h>
566
567 static void
568 bulk4 (mongoc_collection_t *collection)
569 {
570 bson_t opts = BSON_INITIALIZER;
571 mongoc_write_concern_t *wc;
572 mongoc_bulk_operation_t *bulk;
573 bson_error_t error;
574 bson_t *doc;
575 bson_t reply;
576 char *str;
577 bool ret;
578
579 wc = mongoc_write_concern_new ();
580 mongoc_write_concern_set_w (wc, 4);
581 mongoc_write_concern_set_wtimeout_int64 (wc, 100); /* milliseconds */
582 mongoc_write_concern_append (wc, &opts);
583
584 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, &opts);
585
586 /* Two inserts */
587 doc = BCON_NEW ("_id", BCON_INT32 (10));
588 mongoc_bulk_operation_insert (bulk, doc);
589 bson_destroy (doc);
590
591 doc = BCON_NEW ("_id", BCON_INT32 (11));
592 mongoc_bulk_operation_insert (bulk, doc);
593 bson_destroy (doc);
594
595 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
596
597 str = bson_as_canonical_extended_json (&reply, NULL);
598 printf ("%s\n", str);
599 bson_free (str);
600
601 if (!ret) {
602 printf ("Error: %s\n", error.message);
603 }
604
605 bson_destroy (&reply);
606 mongoc_bulk_operation_destroy (bulk);
607 mongoc_write_concern_destroy (wc);
608 bson_destroy (&opts);
609 }
610
611 int
612 main (void)
613 {
614 mongoc_client_t *client;
615 mongoc_collection_t *collection;
616 const char *uri_string = "mongodb://localhost/?appname=bulk4-example";
617 mongoc_uri_t *uri;
618 bson_error_t error;
619
620 mongoc_init ();
621
622 uri = mongoc_uri_new_with_error (uri_string, &error);
623 if (!uri) {
624 fprintf (stderr,
625 "failed to parse URI: %s\n"
626 "error message: %s\n",
627 uri_string,
628 error.message);
629 return EXIT_FAILURE;
630 }
631
632 client = mongoc_client_new_from_uri (uri);
633 if (!client) {
634 return EXIT_FAILURE;
635 }
636
637 mongoc_client_set_error_api (client, 2);
638 collection = mongoc_client_get_collection (client, "test", "test");
639
640 bulk4 (collection);
641
642 mongoc_uri_destroy (uri);
643 mongoc_collection_destroy (collection);
644 mongoc_client_destroy (client);
645
646 mongoc_cleanup ();
647
648 return EXIT_SUCCESS;
649 }
650
651
652 Example reply document and error message:
653
654 { "nInserted" : 2,
655 "nMatched" : 0,
656 "nModified" : 0,
657 "nRemoved" : 0,
658 "nUpserted" : 0,
659 "writeErrors" : [],
660 "writeConcernErrors" : [
661 { "code" : 64,
662 "errmsg" : "waiting for replication timed out" }
663 ] }
664
665 Error: waiting for replication timed out
666
667 The bson_error_t domain is MONGOC_ERROR_WRITE_CONCERN if there are
668 write concern errors and no write errors. Write errors indicate failed
669 operations, so they take precedence over write concern errors, which
670 mean merely that the write concern is not satisfied yet.
671
673 This feature is only available when using MongoDB 3.4 and later.
674
675 bulk-collation.c
676
677 #include <mongoc/mongoc.h>
678 #include <stdio.h>
679
680 static void
681 bulk_collation (mongoc_collection_t *collection)
682 {
683 mongoc_bulk_operation_t *bulk;
684 bson_t *opts;
685 bson_t *doc;
686 bson_t *selector;
687 bson_t *update;
688 bson_error_t error;
689 bson_t reply;
690 char *str;
691 uint32_t ret;
692
693 /* insert {_id: "one"} and {_id: "One"} */
694 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, NULL);
695 doc = BCON_NEW ("_id", BCON_UTF8 ("one"));
696 mongoc_bulk_operation_insert (bulk, doc);
697 bson_destroy (doc);
698
699 doc = BCON_NEW ("_id", BCON_UTF8 ("One"));
700 mongoc_bulk_operation_insert (bulk, doc);
701 bson_destroy (doc);
702
703 /* "One" normally sorts before "one"; make "one" come first */
704 opts = BCON_NEW ("collation",
705 "{",
706 "locale",
707 BCON_UTF8 ("en_US"),
708 "caseFirst",
709 BCON_UTF8 ("lower"),
710 "}");
711
712 /* set x=1 on the document with _id "One", which now sorts after "one" */
713 update = BCON_NEW ("$set", "{", "x", BCON_INT64 (1), "}");
714 selector = BCON_NEW ("_id", "{", "$gt", BCON_UTF8 ("one"), "}");
715 mongoc_bulk_operation_update_one_with_opts (
716 bulk, selector, update, opts, &error);
717
718 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
719
720 str = bson_as_canonical_extended_json (&reply, NULL);
721 printf ("%s\n", str);
722 bson_free (str);
723
724 if (!ret) {
725 printf ("Error: %s\n", error.message);
726 }
727
728 bson_destroy (&reply);
729 bson_destroy (update);
730 bson_destroy (selector);
731 bson_destroy (opts);
732 mongoc_bulk_operation_destroy (bulk);
733 }
734
735 int
736 main (void)
737 {
738 mongoc_client_t *client;
739 mongoc_collection_t *collection;
740 const char *uri_string = "mongodb://localhost/?appname=bulk-collation";
741 mongoc_uri_t *uri;
742 bson_error_t error;
743
744 mongoc_init ();
745
746 uri = mongoc_uri_new_with_error (uri_string, &error);
747 if (!uri) {
748 fprintf (stderr,
749 "failed to parse URI: %s\n"
750 "error message: %s\n",
751 uri_string,
752 error.message);
753 return EXIT_FAILURE;
754 }
755
756 client = mongoc_client_new_from_uri (uri);
757 if (!client) {
758 return EXIT_FAILURE;
759 }
760
761 mongoc_client_set_error_api (client, 2);
762 collection = mongoc_client_get_collection (client, "db", "collection");
763 bulk_collation (collection);
764
765 mongoc_uri_destroy (uri);
766 mongoc_collection_destroy (collection);
767 mongoc_client_destroy (client);
768
769 mongoc_cleanup ();
770
771 return EXIT_SUCCESS;
772 }
773
774
775 Running the above example will result in:
776
777 { "nInserted" : 2,
778 "nMatched" : 1,
779 "nModified" : 1,
780 "nRemoved" : 0,
781 "nUpserted" : 0,
782 "writeErrors" : [ ]
783 }
784
786 Set "w" to zero for an unacknowledged write. The driver sends unac‐
787 knowledged writes using the legacy opcodes OP_INSERT, OP_UPDATE, and
788 OP_DELETE.
789
790 bulk6.c
791
792 #include <mongoc/mongoc.h>
793 #include <stdio.h>
794
795 static void
796 bulk6 (mongoc_collection_t *collection)
797 {
798 bson_t opts = BSON_INITIALIZER;
799 mongoc_write_concern_t *wc;
800 mongoc_bulk_operation_t *bulk;
801 bson_error_t error;
802 bson_t *doc;
803 bson_t *selector;
804 bson_t reply;
805 char *str;
806 bool ret;
807
808 wc = mongoc_write_concern_new ();
809 mongoc_write_concern_set_w (wc, 0);
810 mongoc_write_concern_append (wc, &opts);
811
812 bulk = mongoc_collection_create_bulk_operation_with_opts (collection, &opts);
813
814 doc = BCON_NEW ("_id", BCON_INT32 (10));
815 mongoc_bulk_operation_insert (bulk, doc);
816 bson_destroy (doc);
817
818 selector = BCON_NEW ("_id", BCON_INT32 (11));
819 mongoc_bulk_operation_remove_one (bulk, selector);
820 bson_destroy (selector);
821
822 ret = mongoc_bulk_operation_execute (bulk, &reply, &error);
823
824 str = bson_as_canonical_extended_json (&reply, NULL);
825 printf ("%s\n", str);
826 bson_free (str);
827
828 if (!ret) {
829 printf ("Error: %s\n", error.message);
830 }
831
832 bson_destroy (&reply);
833 mongoc_bulk_operation_destroy (bulk);
834 mongoc_write_concern_destroy (wc);
835 bson_destroy (&opts);
836 }
837
838 int
839 main (void)
840 {
841 mongoc_client_t *client;
842 mongoc_collection_t *collection;
843 const char *uri_string = "mongodb://localhost/?appname=bulk6-example";
844 mongoc_uri_t *uri;
845 bson_error_t error;
846
847 mongoc_init ();
848
849 uri = mongoc_uri_new_with_error (uri_string, &error);
850 if (!uri) {
851 fprintf (stderr,
852 "failed to parse URI: %s\n"
853 "error message: %s\n",
854 uri_string,
855 error.message);
856 return EXIT_FAILURE;
857 }
858
859 client = mongoc_client_new_from_uri (uri);
860 if (!client) {
861 return EXIT_FAILURE;
862 }
863
864 mongoc_client_set_error_api (client, 2);
865 collection = mongoc_client_get_collection (client, "test", "test");
866
867 bulk6 (collection);
868
869 mongoc_uri_destroy (uri);
870 mongoc_collection_destroy (collection);
871 mongoc_client_destroy (client);
872
873 mongoc_cleanup ();
874
875 return EXIT_SUCCESS;
876 }
877
878
879 The reply document is empty:
880
881 { }
882
884 See the Driver Bulk API Spec, which describes bulk write operations for
885 all MongoDB drivers.
886
888 MongoDB, Inc
889
891 2017-present, MongoDB, Inc
892
893
894
895
8961.24.3 Aug 17, 2023 MONGOC_BULK(3)