Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to perform a bulk update of documents in MongoDB with Java?

I'm using MongoDB 3.2 and MongoDB Java Driver 3.2. I have an array of a couple of hundreds of updated documents which should be now saved/stored in MongoDB. In order to do that, I iterate over the array and call for each document in this array the updateOne() method.

Now, I want to re-implement this logic with a bulk update. I tried to find an example of bulk update in MongoDB 3.2 with MongoDB Java Driver 3.2.

I tried this code:

MongoClient mongo = new MongoClient("localhost", 27017);

DB db = (DB) mongo.getDB("test1");
DBCollection collection = db.getCollection("collection");
BulkWriteOperation builder = collection.initializeUnorderedBulkOperation();

builder.find(new BasicDBObject("_id", 1001)).upsert()
    .replaceOne(new BasicDBObject("_id", 1001).append("author", "newName"));

builder.execute();

But it seems that this approach is based on an outdated MongoDB Java Driver, such as 2.4 and uses deprecated methods.

My question:
How to perform a bulk update of documents in MongoDB 3.2 with MongoDB Java Driver 3.2?

like image 716
Mike Avatar asked Mar 07 '16 14:03

Mike


People also ask

How do you update a collection in MongoDB Java?

You can update a single document using the updateOne() method on a MongoCollection object. The method accepts a filter that matches the document you want to update and an update statement that instructs the driver how to change the matching document.

What is bulk operation in Java?

Posted by: Michael Scharhag in Enterprise Java May 10th, 2021 0 2826 Views. Bulk (or batch) operations are used to perform an action on more than one resource in single request. This can help reduce networking overhead.


1 Answers

Using the example in the manual on the new bulkWrite() API, consider the following test collection which contains the following documents:

{ "_id" : 1, "char" : "Brisbane", "class" : "monk", "lvl" : 4 }, { "_id" : 2, "char" : "Eldon", "class" : "alchemist", "lvl" : 3 }, { "_id" : 3, "char" : "Meldane", "class" : "ranger", "lvl" : 3 } 

The following bulkWrite() performs multiple operations on the characters collection:


Mongo shell:

try {     db.characters.bulkWrite([         {              insertOne:{                 "document":{                     "_id" : 4, "char" : "Dithras", "class" : "barbarian", "lvl" : 4                 }             }         },         {              insertOne:{                 "document": {                     "_id" : 5, "char" : "Taeln", "class" : "fighter", "lvl" : 3                 }             }         },         {              updateOne: {                 "filter" : { "char" : "Eldon" },                 "update" : { $set : { "status" : "Critical Injury" } }             }         },         {              deleteOne: { "filter" : { "char" : "Brisbane"} }         },         {              replaceOne: {                "filter" : { "char" : "Meldane" },                "replacement" : { "char" : "Tanys", "class" : "oracle", "lvl" : 4 }             }         }     ]); } catch (e) {  print(e); } 

which prints the output:

{    "acknowledged" : true,    "deletedCount" : 1,    "insertedCount" : 2,    "matchedCount" : 2,    "upsertedCount" : 0,    "insertedIds" : {       "0" : 4,       "1" : 5    },    "upsertedIds" : {     } } 

The equivalent Java 3.2 implementation follows:

MongoCollection<Document> collection = db.getCollection("characters"); List<WriteModel<Document>> writes = new ArrayList<WriteModel<Document>>(); writes.add(     new InsertOneModel<Document>(         new Document("_id", 4)             .append("char", "Dithras")             .append("class", "barbarian")             .append("lvl", 3)     ) ); writes.add(     new InsertOneModel<Document>(         new Document("_id", 5)             .append("char", "Taeln")             .append("class", "fighter")             .append("lvl", 4)     ) ); writes.add(     new UpdateOneModel<Document>(         new Document("char", "Eldon"), // filter         new Document("$set", new Document("status", "Critical Injury")) // update     ) ); writes.add(new DeleteOneModel<Document>(new Document("char", "Brisbane"))); writes.add(     new ReplaceOneModel<Document>(         new Document("char", "Meldane"),          new Document("char", "Tanys")             .append("class", "oracle")             .append("lvl", 4)                ) );  BulkWriteResult bulkWriteResult = collection.bulkWrite(writes); 

For your question use the replaceOne() method and this would be implemented as

MongoCollection<Document> collection = db.getCollection("collection"); List<WriteModel<Document>> writes = Arrays.<WriteModel<Document>>asList(     new ReplaceOneModel<Document>(         new Document("_id", 1001), // filter         new Document("author", "newName"), // update         new UpdateOptions().upsert(true) // options     )    );  BulkWriteResult bulkWriteResult = collection.bulkWrite(writes); 
like image 197
chridam Avatar answered Oct 06 '22 08:10

chridam