gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:11:44 25 4
gpt4 key购买 nike

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

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

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

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

我已经能够看到的功能。

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

我希望我不必滚动自己的分页(计算 skip 和 limit 参数,我想这并不难)并直接调用模板,但我想我可以,如果那是最好的选择。

最佳答案

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

  • 写了一个 DAO 方法,它接受我们的任意过滤器字符串(我有一个实用程序可以将它转换为标准的 mongo JSON 查询语法。
  • 将其包装在 BasicQuery 中以获得“countQuery”。
  • 使用该 countQuery 获取使用 MongoTemplate#count(Query, Class) 的记录总数
  • 使用 Query#with(Pageable) 添加我的分页标准以创建“pageQuery”
  • 使用 MongoTemplate#find(Query, Pageable) 运行页面查询
  • 获取 List<T>结果是,Pageable用于查询和 count从 countQuery 运行返回,并构造一个新的 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);

关于mongodb - 是否可以使用 SpringData MongoDB 存储库执行带有分页的任意查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17255932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com