In the earlier versions of MongoDB Java drivers , to run a query and do unordered bulk upsert on the result all we had do was :
BulkWriteOperation bulk = dbCollection.initializeUnorderedBulkOperation();
bulk.find(searchQuery).upsert().update(new BasicDBObject("$set", getDbObjectModel()));
But in version 3, with the introduction of Bson Document support and MongoCollection.bulkWrite() method how can this be done?
I tried this :
List<WriteModel<Document>> documentList = new ArrayList<>();
collection.bulkWrite(documentList, new BulkWriteOptions().ordered(false));
but, I need the upsert functionality.
Thanks.
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.