使用 MongoDB Java 3.0 驱动程序批量更新
Bulk Upsert with MongoDB Java 3.0 Driver
在 MongoDB Java 驱动程序的早期版本中,运行 查询并对结果进行无序批量更新插入,我们所做的只是:
BulkWriteOperation bulk = dbCollection.initializeUnorderedBulkOperation();
bulk.find(searchQuery).upsert().update(new BasicDBObject("$set", getDbObjectModel()));
但是在第 3 版中,引入了 Bson 文档支持和 MongoCollection.bulkWrite() 方法,如何做到这一点?
我试过了:
List<WriteModel<Document>> documentList = new ArrayList<>();
collection.bulkWrite(documentList, new BulkWriteOptions().ordered(false));
但是,我需要更新插入功能。
谢谢。
您仍然可以使用所有功能,只是 BulkWrites 现在具有不同的语法:
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);
因此您使用 UpdateOneModel
( or for many if you want ) and set the UpdateOptions
作为构造函数的第三个参数。
需要一些时间来适应,但它基本上只是使用与其他地方相同的语法构建 "Lists"。我想这是改变的主要原因。
如果你想要一些东西 findAndModifyElseCreate();
这意味着如果文档存在则更新它,否则创建它并插入数据然后请按照此操作。
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);
这是使用最新 API 的示例..
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 options
BulkWriteOptions 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();
详细信息位于:https://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-bulkwrite-java-api.html
在 MongoDB Java 驱动程序的早期版本中,运行 查询并对结果进行无序批量更新插入,我们所做的只是:
BulkWriteOperation bulk = dbCollection.initializeUnorderedBulkOperation();
bulk.find(searchQuery).upsert().update(new BasicDBObject("$set", getDbObjectModel()));
但是在第 3 版中,引入了 Bson 文档支持和 MongoCollection.bulkWrite() 方法,如何做到这一点?
我试过了:
List<WriteModel<Document>> documentList = new ArrayList<>();
collection.bulkWrite(documentList, new BulkWriteOptions().ordered(false));
但是,我需要更新插入功能。
谢谢。
您仍然可以使用所有功能,只是 BulkWrites 现在具有不同的语法:
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);
因此您使用 UpdateOneModel
( or for many if you want ) and set the UpdateOptions
作为构造函数的第三个参数。
需要一些时间来适应,但它基本上只是使用与其他地方相同的语法构建 "Lists"。我想这是改变的主要原因。
如果你想要一些东西 findAndModifyElseCreate(); 这意味着如果文档存在则更新它,否则创建它并插入数据然后请按照此操作。
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);
这是使用最新 API 的示例..
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 options
BulkWriteOptions 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();
详细信息位于:https://ashutosh-srivastav-mongodb.blogspot.in/2017/09/mongodb-bulkwrite-java-api.html