我已经google了一段时间,不确定Spring Data MongoDB是否支持批量保存。
我需要将一组文档作为原子保存到 mongo 中,要么全部保存,要么不保存。
任何人都可以为此分享链接或一些示例代码吗?
我已经google了一段时间,不确定Spring Data MongoDB是否支持批量保存。
我需要将一组文档作为原子保存到 mongo 中,要么全部保存,要么不保存。
任何人都可以为此分享链接或一些示例代码吗?
当您通过 MongoDB Java 驱动程序进行保存时,您只能将单个文档传递给 MongoDB。
进行插入时,可以传递单个元素,也可以传递元素数组。后者将导致“批量插入”(即客户端的单个插入命令将导致在服务器上插入多个文档)。
但是,由于 MongoDB 不支持事务的概念,如果其中一个插入失败,则无法指示应该删除或回滚先前插入的文档。
出于原子性的目的,每个文档插入都是一个单独的操作,并且不支持使 MongoDB 插入全部或不插入的方法。
如果这是您的应用程序需要的东西,可能还有其他方法可以实现它: - 更改您的架构,以便这些是单个父文档的子文档(那么从技术上讲,父文档只有一个“插入”) - 编写事务语义到您的应用程序代码 - 使用本机支持两阶段提交事务的数据库。
我们已经使用 Spring Data 和 Mongo Driver 来实现将数据从一个数据库服务器复制到另一个数据库服务器。
import com.mongodb.MongoBulkWriteException;
import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.model.BulkWriteOptions;
import com.mongodb.client.model.InsertOneModel;
import com.mongodb.client.model.WriteModel;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
@Component
public class DataCopy{
public void copyData(MongoTemplate sourceMongo,MongoTemplate destinationMongo ){
Class cls = EmployeeEntity.class;
String collectionName = sourceMongo.getCollectionName(cls).get();
MongoCollection<Document> collection = destinationMongo.getCollection(collectionName);
Query findQuery = new Query();
Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("firstName").is("someName"),
Criteria.where("lastName").is("surname"));
query.addCriteria(criteria);
Pageable pageable = PageRequest.of(0, 10000);
findQuery.with(pageable);
List<?> pagedResult = sourceMongo.find(findQuery, cls).get()
while (!pagedResult.isEmpty()) {
try {
BulkWriteResult result = collection.bulkWrite(
pagedResult.
stream().map(d -> mapWriteModel(d, destinationMongo)).collect(Collectors.toList()),
new BulkWriteOptions().ordered(false));
} catch (Exception e) {
log.error("failed to copy", e);
}
pageable = pageable.next();
findQuery.with(pageable);
pagedResult = sourceMongo.find(findQuery, cls).get();
}
}
}
private WriteModel<? extends Document> mapWriteModel(Object obj,
MongoTemplate mongoTemplate
) {
Document document = new Document();
mongoTemplate.getConverter().write(obj, document);
return new InsertOneModel<>(document);
}
// Code example to create mongo templates for source and target databases
MongoClient targetClient = new MongoClient("databaseUri")
MongoTemplate destinationMongo = new MongoTemplate(targetClient, "databaseName");
希望这对您有所帮助。