How to bulk update documents in MongoDB using Java

I am using MongoDB 3.2 and MongoDB Java Driver 3.2. I have an array of several hundred updated documents that should now be saved / saved in MongoDB . To do this, I updateOne() over the array and call the updateOne() method for each document in this array.

Now I want to re-implement this logic with a bulk update. I tried to find a bulk update example 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 the obsolete MongoDB Java Driver , such as 2.4, and uses obsolete methods.

My question is:
How to bulk update documents in MongoDB 3.2 using MongoDB Java Driver 3.2?

+7
java mongodb crud bulkinsert mongodb-query
source share
1 answer

Using the example in the new bulkWrite() API bulkWrite() , 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 several operations in the characters collection:


Mongolian 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 following is an equivalent implementation of Java 3.2:

 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 will 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); 
+8
source share

All Articles