我正在使用Spring Data MongoDB,并希望执行批量更新,就像这里描述的那样:http://docs.mongodb.org/manual/reference/method/Bulk.find.update/#Bulk.find.update
使用常规驱动程序时,它看起来像这样:
以下示例初始化项集合的Bulk()操作构建器,并将各种多更新操作添加到操作列表中。
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );
bulk.find( { item: null } ).update( { $set: { item: "TBD" } } );
bulk.execute()
有没有办法用Spring Data MongoDB实现类似的结果?
答案 0 :(得分:21)
spring-data-mongodb 1.9.0.RELEASE 支持批量更新。这是一个示例:
BulkOperations ops = template.bulkOps(BulkMode.UNORDERED, Match.class);
for (User user : users) {
Update update = new Update();
...
ops.updateOne(query(where("id").is(user.getId())), update);
}
ops.execute();
答案 1 :(得分:5)
只要驱动程序是最新的并且您正在与之通信的服务器至少是MongoDB,就可以使用它,这是批量操作所必需的。不要相信Spring数据中有任何直接的东西(对于其他更高级别的驱动程序抽象也是如此),但您当然可以访问实现Bulk API访问权限的本机驱动程序集合对象: / p>
DBCollection collection = mongoOperation.getCollection("collection");
BulkWriteOperation bulk = collection.initializeOrderedBulkOperation();
bulk.find(new BasicDBObject("status","D"))
.update(new BasicDBObject(
new BasicDBObject(
"$set",new BasicDBObject(
"status", "I"
).append(
"points", 0
)
)
));
bulk.find(new BasicDBObject("item",null))
.update(new BasicDBObject(
new BasicDBObject(
"$set", new BasicDBObject("item","TBD")
)
));
BulkWriteResult writeResult = bulk.execute();
System.out.println(writeResult);
您可以通过定义它们来填写所需的DBObject
类型,也可以使用spring mongo库中提供的构建器,这些构建器都应支持“提取”它们构建的DBObject
。
答案 2 :(得分:0)
public <T> void bulkUpdate(String collectionName, List<T> documents, Class<T> tClass) {
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, tClass, collectionName);
for (T document : documents) {
Document doc = new Document();
mongoTemplate.getConverter().write(document, doc);
org.springframework.data.mongodb.core.query.Query query = new org.springframework
.data.mongodb.core.query.Query(Criteria.where(UNDERSCORE_ID).is(doc.get(UNDERSCORE_ID)));
Document updateDoc = new Document();
updateDoc.append("$set", doc);
Update update = Update.fromDocument(updateDoc, UNDERSCORE_ID);
bulkOps.upsert(query, update);
}
bulkOps.execute();
}
Spring Mongo模板用于执行更新。如果您在文档列表中提供_id字段,则上面的代码将起作用。