是否可以使用 SpringData MongoDB 存储库执行带有分页的任意查询?

Mic*_*ell 5 pagination mongodb spring-data

我们有一个用例,用户可以为集合传入任意搜索条件,并希望输出分页。使用 Spring Data 存储库,如果我们通过简单的扩展 MongoRepository 并声明一个:

Page<Thing> findByFooAndBarAndBaz(Type foo, Type bar, Type baz, Pageable page)

但是,如果我们自己生成查询,要么使用 fluent 接口,要么构造一个 mongo 字符串并将其包装在一个BasicQuery类中,我找不到将其放入存储库实例的方法。没有:

Page<Thing> findByQuery(Query q, Pageable page)

我已经能够看到的功能。

我也看不到如何MongoTemplate使用 Page 抽象来连接查询功能。

我希望我不必滚动自己的分页(计算跳过和限制参数,我认为这并不难)并直接调用模板,但如果这是最佳选择,我想我可以。

Mic*_*ell 4

我认为这不能按照我希望的方式完成,但我已经想出了一个解决方法。作为背景,我们将所有用于数据访问的方法放在 DAO 中,一些委托给存储库,一些委托给模板。

  • 编写了一个 DAO 方法,它接受我们的任意过滤字符串(我有一个实用程序可以将其转换为标准 mongo JSON 查询语法。
  • 将其包装在 BasicQuery 中以获得“countQuery”。
  • 使用该 countQuery 来获取记录总数MongoTemplate#count(Query, Class)
  • 附加我的分页条件以使用以下命令创建“pageQuery”Query#with(Pageable)
  • 运行 pageQueryMongoTemplate#find(Query, Pageable)
  • List<T>从中获取Pageable用于查询的结果和countcountQuery 运行返回的结果,并构造一个新的PageImp返回给调用者。

基本上,这DocDbDomain是一个用于测试文档数据库内容的测试域类):

    Query countQuery = new BasicQuery(toMongoQueryString(filterString));
    Query pageQuery = countQuery.with(pageRequest);
    long total = template.count(countQuery, DocDbDomain.class);

    List<DocDbDomain> content = template.find(pageQuery, DocDbDomain.class);

    return new PageImpl<DocDbDomain>(content, pageRequest, total);
Run Code Online (Sandbox Code Playgroud)