https://github.com/spring-projects/spring-data-mongodb/issues/2821
https://jira.spring.io/browse/DATAMONGO-1922?redirect=false
我一直在寻找 ReactiveBulk 操作来在 Spring WebFlux 中批量更新文档。
就像 Mongo 模板一样
var bulkOps = mongoTemplate.bulkOps()
for(dto : List<DTO> DTOs) {
Query query = new Query();
query.addCriteria(Criteria.where(ID).is(dto.getId()));
Update update = new Update()
.set(STATUS, dto.getStatus())
bulkOps.updateOne(query, update)
}
bulkOps.execute();
由于reactivemongotemplate当前看起来不支持该操作,是否有解决方法以 react 方式实现该操作?
最佳答案
快速提醒一下 Bulk 与 UpdateMulti 不同。
批量意味着在单个查询中写入多个对象,因此更新多个对象。另一方面,UpdateMulti 旨在更新表达式匹配的所有行
对于响应式(Reactive)批量,您应该能够使用 ReactiveMongoTemplate
并实现类似的东西:
reactiveMongoTemplate.getCollection("collection_name")
.flatMap(mongoCollection -> {
List<UpdateOneModel<Document>> operations = DTOs.stream()
.map(dto -> {
Document doc = new Document("status", dto.getStatus());
reactiveMongoTemplate.getConverter().write(dto, doc);
Document filter = new Document("id", dto.getId());
return new UpdateOneModel<Document>(filter, new Document("$set", doc))
}).toList();
return Mono.from(mongoCollection.bulkWrite(operations));
});
如果需要,您还可以向 bulkWrite()
添加自定义选项。
如果需要更多过滤器,您可以将它们附加到文档中
Document filter = new Document("id", dto.getId())
.append("country", dto.getCountry);
关于java - Spring Webflux 响应式(Reactive) Mongo 批量操作 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72320304/