使用 Mongo Reactive Repository 和 project reactor 进行数据替换
Data replacement using MongoReactiveRepository nad project reactor
如果 mongo 中的数据与已存储的数据不同,我会尝试替换它,并且我编写了这段代码
public <T> Mono<Void> replaceObjectsIfNotAlreadyStored(List<T> products, ReactiveCrudRepository<T, String> objRepository) {
return objRepository.findAll()
.collectList()
.filter(productsList -> !areAlreadyInDb(productsList, products))
.flatMap(products1 -> objRepository.deleteAll()).
doOnSuccess(products1 -> objRepository.saveAll(products).collectList());
}
但是当我尝试测试它时
@Test
public void replaceObjectsIfNotAlreadyStoredNeg() {
repository.saveAll(products)
.collectList()
.block();
checksumService.replaceObjectsIfNotAlreadyStored(otherList, repository).block();
List<Product> current = repository.findAll()
.collectList()
.block();
assertEquals(current, otherList);
repository.deleteAll()
.block();
}
当前列表为空,而不是与其他列表相同
这是因为您正试图在 doOn* 方法中触发一些异步处理,这与 flatMap 不同,它不订阅内部的 flux/mono。你必须以某种方式订阅,推荐的方法是使用 flatMap(如果你想在前一个运算符有结果时做某事,我不相信这里是这种情况)或 switchIfEmpty(如果源运算符什么都不发出,但仍然成功)
如果 mongo 中的数据与已存储的数据不同,我会尝试替换它,并且我编写了这段代码
public <T> Mono<Void> replaceObjectsIfNotAlreadyStored(List<T> products, ReactiveCrudRepository<T, String> objRepository) {
return objRepository.findAll()
.collectList()
.filter(productsList -> !areAlreadyInDb(productsList, products))
.flatMap(products1 -> objRepository.deleteAll()).
doOnSuccess(products1 -> objRepository.saveAll(products).collectList());
}
但是当我尝试测试它时
@Test
public void replaceObjectsIfNotAlreadyStoredNeg() {
repository.saveAll(products)
.collectList()
.block();
checksumService.replaceObjectsIfNotAlreadyStored(otherList, repository).block();
List<Product> current = repository.findAll()
.collectList()
.block();
assertEquals(current, otherList);
repository.deleteAll()
.block();
}
当前列表为空,而不是与其他列表相同
这是因为您正试图在 doOn* 方法中触发一些异步处理,这与 flatMap 不同,它不订阅内部的 flux/mono。你必须以某种方式订阅,推荐的方法是使用 flatMap(如果你想在前一个运算符有结果时做某事,我不相信这里是这种情况)或 switchIfEmpty(如果源运算符什么都不发出,但仍然成功)