Azure Cosmos DB带WHERE条件查询时continuation token不生效问题
问题根因
你代码里有两处直接导致分页失效的错误:
- 调用带筛选的查询时,完全没有把入参的
token传入查询配置,所以每次调用接口都相当于重新执行首次查询,自然拿不到后续页的数据。 - 存储清空逻辑写重复了,
if (!token)判断之后又写了一遍this.store.lube.removeAll(),等于不管有没有传token,每次调用都会清空已存储的历史数据,就算拿到后续页数据也会把之前加载的内容覆盖掉,容易误以为没有返回新数据。
修正后的代码
// <按可用状态查询> async getByAvailability(availability: boolean, token?: string, limit = 5) { // 只有首次无token查询时才清空存储 if (!token) this.store.lube.removeAll(); const querySpec = { query: "SELECT * FROM c WHERE c.isAvailable = @availability", parameters: [ { name: "@availability", value: availability, }, ], }; const { resources: items, continuationToken, hasMoreResults, } = await this.dbContainer.items .query<ILube>(querySpec, { maxItemCount: limit, // 传入续查token,为核心修复点 continuationToken: token }) .fetchNext(); this.store.lube.load(items); return { hasMoreResults, continuationToken }; }
其他注意事项
- 如果你的容器是多分区配置,跨分区查询的续查token要求前后两次查询的筛选条件、查询范围完全一致,不要中途修改查询参数。
- 不同查询的continuation token不能混用,即使筛选条件只有细微差别,生成的token也不通用。
- 建议确认你筛选的
isAvailable字段已经加入容器的索引策略,未索引的字段查询扫描范围过大可能会导致分页异常。
内容的提问来源于stack exchange,提问作者D.K. Ananias
相关产品推荐
相关产品推荐

