【问题标题】:Querying mongodb collection SpringWebFlux with reactivemongodb使用reactivemongodb查询mongodb集合SpringWebFlux
【发布时间】:2019-12-05 07:03:54
【问题描述】:

我正在使用响应式 mongodb 开发简单的 spring webflux 演示应用程序,我想按名称读取 Employee 的所有数据,除了包含名称字段“joe”、“Sara”、“JOE”、“SARA”,我有以下代码:

//仓库接口

public interface EmployeeRepository extends ReactiveMongoRepository<Employee, String>{
 Flux<Employee> findAllByName(String name);
}

//服务类

public class EmplyeeService
{

private EmployeeRepository employeeRepository;

public Flux<Employee> findAllByOrganizationName(String name)
 {

        return employeeRepository.findAllByName(name);

    }

 public Flux<String> getAllNameExceptSome(String name)
{
     Employee emp1=new Employee();
     List<Flux<Employee>> emp=Arrays.asList(employeeRepository.findAllByName(name));
     Flux<Flux<Employee>> emp2=Flux.fromIterable(emp)
             .filter(name->name.equalsIgnoreCase("joe"));
     return emp2;
  }
}

【问题讨论】:

  • 这是阻塞代码而不是响应式代码。 findAllByName 应该返回一个 Flux,您直接过滤并返回。
  • @M.Deinum,感谢您的回复,现在我们有了响应式代码。
  • 你的问题是什么?
  • @firegloves,上面的代码不像我想要的那样工作,比如从 mongo 集合中获取名称,除了上面问题中描述的一些名称。

标签: spring-boot spring-webflux


【解决方案1】:

首先,除非某些特殊情况,否则应该避免使用这些数据结构:

List<Flux<Employee>>
Flux<Flux<Employee>>

但是,您没有使用 Spring Data。您只需将存储库更改为:

public interface EmployeeRepository extends ReactiveMongoRepository<Employee, String> {

   // this find all Employee except those matching names provided as param
   Flux<Employee> findAllByNameNotIn(List<String> nameList);

   // this find all Employee matching names provided as param
   Flux<Employee> findAllByNameIn(List<String> nameList);
}

调用此方法,您将获得已按名称过滤的员工列表。

【讨论】:

  • 我想读取我留下的数据,就像前面的例子“Joe”和“Sara”一样。我想要“Joe”、“Sara”分开?
  • 你可以简单地添加另一个没有Not关键字的方法。我编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 2017-09-15
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2019-05-09
  • 2016-09-27
相关资源
最近更新 更多