提问人:Swetha 提问时间:11/17/2023 最后编辑:Roman CSwetha 更新时间:11/18/2023 访问量:49
在 Java 中分页时是否可以只使用一次对数据库的调用?
Is it posible to use only one call to database when pagination in Java?
问:
如果页面大小为 10 且为 0,则在给定条件下,如果我从 mongodb 获得 50 个文档,则应为 50 并且应该具有第一个 10 个文档(DTO)的详细信息(因为 0 即分页)。pageNumber
total_documents
msList
pageNumber
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调用来实现相同的功能?
有人可以在这方面提供帮助吗?
答:
0赞
Roman C
11/17/2023
#1
执行分页时,通常使用两个查询:第一个查询将计算总大小,第二个查询使用两个参数返回实际记录:和 .pageNumber
pageSize
这两个查询彼此独立,无法联接。因此,使用 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这是不可能的。
评论