在 Java 中分页时是否可以只使用一次对数据库的调用?

Is it posible to use only one call to database when pagination in Java?

提问人:Swetha 提问时间:11/17/2023 最后编辑:Roman CSwetha 更新时间:11/18/2023 访问量:49

问:

如果页面大小为 10 且为 0,则在给定条件下,如果我从 mongodb 获得 50 个文档,则应为 50 并且应该具有第一个 10 个文档(DTO)的详细信息(因为 0 即分页)。pageNumbertotal_documentsmsListpageNumber

Query query = new Query();
List<Criteria> criteria = new ArrayList<>();
criteria.add(Criteria.where("di.ai").in(new ArrayList<>(Arrays.asList("123"))));
query.addCriteria(new Criteria().andOperator(criteria.toArray(new Criteria[criteria.size()])));
Long total_documents = this.mongoTemplate.count(query, NSDTO.class, MONGODB_MESSAGE_COLLECTION);
Pageable pageable = PageRequest.of((pageNumber - 1), pageSize);
query.with(pageable);    
List<NSDTO> nsList= this.mongoTemplate.find(query, NSDTO.class, MONGODB_MESSAGE_COLLECTION);"

我能够使用上面的代码实现此功能,但这里的问题是我们正在进行 mongodb 调用 2 次。

是否可以仅使用一个mongodb调用来实现相同的功能?

有人可以在这方面提供帮助吗?

Java Spring MongoDB 分页 条件查询

评论


答:

0赞 Roman C 11/17/2023 #1

执行分页时,通常使用两个查询:第一个查询将计算总大小,第二个查询使用两个参数返回实际记录:和 .pageNumberpageSize

这两个查询彼此独立,无法联接。因此,使用 CreteriaQuery API 和分页本身是不可能的。

评论

0赞 Swetha 11/18/2023
但是,由于我们正在对 mongo db 进行 2 次调用,因此我们在性能方面付出了更多的代价。如果无法避免对 mongodb 的 2 次调用,我们还能做些什么来提高性能
0赞 Roman C 11/18/2023
我不明白你说的是什么表现。您指的是查询性能还是数据库性能?对于数据库 1 或 2 查询没有区别,数据库性能允许它。如果要优化查询的性能,请查看 where 条件中的字段并使用索引。您可以进一步阅读,这是您的指南。explain()
0赞 Swetha 11/18/2023
性能问题是代码两次进入mongodb会增加响应时间,我唯一的问题是我们能否从代码的单个mongodb调用中实现paginantion以及总结果集计数
0赞 Roman C 11/18/2023
这不是问题,正如我在答案中所说,你不能。
0赞 ray 11/18/2023 #2

可以使用 在一次调用中实现分页。请注意不要页面大小太大,因为由于 16MB MongoDB 文档大小限制,它会失败。$facet

db.collection.aggregate([
  {
    "$facet": {
      "paginationMeta": [
        {
          "$match": {
            //your match criteria here
            
          }
        },
        {
          "$count": "total_documents"
        }
      ],
      page: [
        {
          "$match": {
            //your match criteria here
            
          }
        },
        {
          "$sort": {
            key: 1
          }
        },
        {
          "$skip": 20
        },
        {
          "$limit": 10
        }
      ]
    }
  }
])

蒙戈游乐场

评论

0赞 Swetha 11/18/2023
嗨,如果可能的话,你能给我一个java spring代码吗?
0赞 Roman C 11/18/2023
@Swetha这是不可能的。