我有一个API,可根据出现在文档字段中的关键字来检索文档。我想对结果进行分页,以便可以将文档返回给发送请求的客户端,并允许他们在需要时请求更多文档。当我在Azure数据资源管理器中时,查询本身仅在浏览器中花费一秒钟左右的时间,但是当我使用Python DocumentDB库进行查询时,它花费了大约一分钟的时间。

查看Microsoft Cosmos DB REST API,似乎好像使用了两个令牌x-ms_continuation和x-ms-max-item-count。

似乎没有将这些作为条目放入document_client.QueryDocuments()的选项字典中的方法。

在GitHub存储库中,Read()方法引用options参数:

    headers = base.GetHeaders(self,
                              initial_headers,
                              'get',
                              path,
                              id,
                              type,
                              options)
    # Read will use ReadEndpoint since it uses GET operation
    url_connection = self._global_endpoint_manager.ReadEndpoint
    result, self.last_response_headers = self.__Get(url_connection,
                                                    path,
                                                    headers)


在文件所在的base.py中,我看到了这两个代码块

if options.get('continuation'):
    headers[http_constants.HttpHeaders.Continuation] = (
        options['continuation'])

if options.get('maxItemCount'):
    headers[http_constants.HttpHeaders.PageSize] = options['maxItemCount']


这似乎与上面的两个参数相对应。但是,当我将它们设置为查询({'continuation':True,'maxItemCount':10})中的选项时,没有任何变化。

最终查询看起来像

client.QueryDocuments(collection_link, query, {'continuation':True,'maxItemCount':10})


我也尝试过使用maxItemCount的字符串代替int。

我在这里做错了什么?

编辑:标头与上述文档中来自http_constants.py的标头相同:

# Our custom DocDB headers
Continuation = 'x-ms-continuation'
PageSize = 'x-ms-max-item-count'

最佳答案

连续令牌的工作方式是,当您查询文档并且有更多可用文档与该查询匹配时,服务会为您返回一个标记(或标记),您需要在下一个查询中包括该标记(或标记)。这将告诉服务从该标记而不是开始获取文档。

因此,在您的代码中,第一个查询将没有连续参数(或null)。得到结果后,您应该确定服务是否返回了令牌。如果没有返回令牌,则意味着没有更多可用数据。但是,如果返回了令牌,则应在第二个查询的查询选项中包括该令牌。

关于python - 如何在Python中为document_client对象发送的Cosmos DB查询设置延续 token ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47705124/

10-12 22:06
查看更多