You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cosmos DB中分页查询文档?每次获取500条数据

在Cosmos DB中实现批量分页查询

当然可以!针对你需要分批获取数千份文档的需求,Cosmos DB提供了两种实用方案,我会详细说明每种的用法、适用场景和注意事项:

方案1:OFFSET + LIMIT(适合小范围分页)

这个方式和标准SQL的分页逻辑一致,通过OFFSET指定要跳过的文档数量,LIMIT设置每页返回的条数。

比如获取前500条文档:

SELECT * FROM c
OFFSET 0 LIMIT 500

要获取第501-1000条,只需调整OFFSET的值:

SELECT * FROM c
OFFSET 500 LIMIT 500

⚠️ 注意:这种方式的缺点是性能会随OFFSET值增大而下降——因为Cosmos DB需要先扫描并跳过前面所有的文档,才能返回目标数据。如果你的分页范围很大(比如要跳到第10000条之后),这种方法的效率会很低,更适合小范围分页或者数据量不大的场景。

方案2:延续令牌(Continuation Token,推荐用于大数据集)

这是Cosmos DB官方推荐的高效分页方案,它会记录当前查询的“位置”,下一次查询直接从该位置继续,无需重新扫描前面的文档,性能优势非常明显。

以.NET SDK为例(其他SDK逻辑类似):

  1. 第一次查询(获取前500条):
// 定义查询语句
var query = new QueryDefinition("SELECT * FROM c");
// 创建查询迭代器,设置每页最多返回500条
var iterator = container.GetItemQueryIterator<YourDocumentType>(query, requestOptions: new QueryRequestOptions { MaxItemCount = 500 });

// 获取第一页数据
var firstPage = await iterator.ReadNextAsync();
// 保存延续令牌,用于下一页查询
string continuationToken = iterator.ContinuationToken;
  1. 后续查询(获取501-1000条及之后的批次):
// 使用之前保存的延续令牌创建新的迭代器
var nextIterator = container.GetItemQueryIterator<YourDocumentType>(query, continuationToken: continuationToken, requestOptions: new QueryRequestOptions { MaxItemCount = 500 });

// 获取下一页数据
var nextPage = await nextIterator.ReadNextAsync();
// 更新延续令牌,用于后续分页
continuationToken = nextIterator.ContinuationToken;

重复这个过程,直到continuationToken为null,就说明已经没有更多文档可以获取了。

关键注意点:

  • 延续令牌和具体的查询语句绑定,如果修改了查询的过滤条件、排序规则等,之前的令牌会失效,需要重新发起初始查询。
  • 延续令牌的有效期是5分钟,如果两次查询间隔超过这个时间,令牌会过期,同样需要重新开始。
  • 如果你的查询包含排序逻辑,一定要在排序字段上创建对应的索引,否则会影响分页性能。

内容的提问来源于stack exchange,提问作者Oscar A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:35:45