如何在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逻辑类似):
- 第一次查询(获取前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;
- 后续查询(获取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
相关产品推荐
相关产品推荐

