Bulk Upsert with MongoDB Java 3.0 Driver Bulk Upsert with MongoDB Java 3.0 Driver mongodb mongodb

Bulk Upsert with MongoDB Java 3.0 Driver


You can still use all of the functionality, it's just that BulkWrites now have a different syntax:

    MongoCollection<Document> collection = db.getCollection("sample");    List<WriteModel<Document>> updates = Arrays.<WriteModel<Document>>asList(        new UpdateOneModel<Document>(                new Document(),                   // find part                new Document("$set",1),           // update part                new UpdateOptions().upsert(true)  // options like upsert        )    );    BulkWriteResult bulkWriteResult = collection.bulkWrite(updates);

So you use the UpdateOneModel ( or for many if you want ) and set the UpdateOptions as the third argument to the constructor.

Takes some getting used to, but it's basically just building "Lists" with all the same syntax as elsewhere. I guess that's the main reason for the change.


Here is the example using latest APIs..

for (Long entityId : entityIDs) {    //Finder doc    Document filterDocument = new Document();    filterDocument.append("_id", entityId);    //Update doc    Document updateDocument = new Document();    Document setDocument = new Document();    setDocument.append("name", "xyz");    setDocument.append("role", "abc");    updateDocument.append("$set", setDocument);    //Update option    UpdateOptions updateOptions = new UpdateOptions();    updateOptions.upsert(true); //if true, will create a new doc in case of unmatched find    updateOptions.bypassDocumentValidation(true); //set true/false    //Prepare list of Updates    updateDocuments.add(            new UpdateOneModel<Document>(                    filterDocument,                    updateDocument,                    updateOptions));}//Bulk write optionsBulkWriteOptions bulkWriteOptions = new BulkWriteOptions();bulkWriteOptions.ordered(false);bulkWriteOptions.bypassDocumentValidation(true);MongoCollection<Document> mongoCollection = mongoDB.getCollection("myCollection");BulkWriteResult bulkWriteResult = null;try {    //Perform bulk update    bulkWriteResult = mongoCollection.bulkWrite(updateDocuments,            bulkWriteOptions);} catch (BulkWriteException e) {    //Handle bulkwrite exception    List<BulkWriteError> bulkWriteErrors = e.getWriteErrors();    for (BulkWriteError bulkWriteError : bulkWriteErrors) {        int failedIndex = bulkWriteError.getIndex();        Long failedEntityId = entityIDs.get(failedIndex);        System.out.println("Failed record: " + failedEntityId);        //handle rollback    }}int rowsUpdated = bulkWriteResult.getModifiedCount();

Details at: https://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-bulkwrite-java-api.html


If you want something findAndModifyElseCreate();That means if the document exist then update it else create it and insert the data then PLEASE FOLLOW THIS.

BasicDBObject insertInCaseDocumentNotFound = new BasicDBObject();insertInCaseDocumentNotFound.put("field1", "value1");insertInCaseDocumentNotFound.put("date", new Date());MongoCollection<BasicDBObject> table = db.getCollection("collectionName",BasicDBObject.class);BasicDBObject updateObject = new BasicDBObject();updateObject.append("$setOnInsert", new BasicDBObject());updateObject.append("$set", new BasicDBObject("date",new Date());List<WriteModel<BasicDBObject>> updates = Arrays.<WriteModel<BasicDBObject>> asList(                new UpdateOneModel<BasicDBObject>(new BasicDBObject("search_name", alert.getString("search_name")), // query for which we need to apply                        updateObject, // update the document in case it is found                        new UpdateOptions().upsert(true) // upsert to insert new data in case document is not found        ));table.bulkWrite(updates);