使用mongocxx驱动实现MongoDB分页,如何判断是否存在更多结果?
在C++中用mongocxx实现带"是否有更多数据"的分页查询
要优雅解决这个问题,核心思路是查询11条数据:取前10条作为分页结果,只要能拿到第11条,就说明还有更多数据可以查询。这种方式不用拉取全量数据,性能更优。
具体实现步骤
- 构造查询时,将
limit设置为10 + 1 = 11 - 遍历查询结果:
- 先收集前10条到
std::vector中 - 如果遍历到第11条,直接标记
more_items为true并终止遍历(不用继续处理后续数据)
- 先收集前10条到
- 最终返回前10条结果和
more_items状态
代码示例
#include <mongocxx/client.hpp> #include <mongocxx/instance.hpp> #include <bsoncxx/builder/stream/document.hpp> #include <vector> using bsoncxx::builder::stream::document; using bsoncxx::builder::stream::finalize; struct PaginatedResult { std::vector<bsoncxx::document::value> items; bool has_more; }; PaginatedResult get_paginated_data(mongocxx::collection& coll, const bsoncxx::document::view& filter) { PaginatedResult result; result.has_more = false; const int page_size = 10; const int fetch_count = page_size + 1; // 执行查询,限制返回11条 auto cursor = coll.find(filter).limit(fetch_count); int count = 0; for (auto&& doc : cursor) { if (count < page_size) { // 前10条加入结果集 result.items.push_back(doc); } else { // 拿到第11条,标记有更多数据 result.has_more = true; // 直接终止遍历,无需处理剩余数据 break; } ++count; } return result; }
优势说明
- 避免拉取全量数据的性能开销,尤其适合数据量较大的集合
- 仅需一次查询就能同时获取分页结果和是否有更多数据的状态
- 逻辑简洁,无需遍历全量结果到第10条后再终止,减少不必要的迭代
内容的提问来源于stack exchange,提问作者LNorth
相关产品推荐
相关产品推荐

