如何为Python中的document_client对象发送的Cosmos DB查询设置延续令牌?

时间:2017-12-07 22:49:10

标签: python azure azure-cosmosdb

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

查看Microsoft Cosmos DB REST API,好像有两个令牌, x-ms_continuation x-ms-max-item-count 使用

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

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

    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的<。<}的字符串。

我在这里做错了什么?

编辑:标题与上面文档中的标题相同,来自http_constants.py

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

事实证明,需要从结果对象本身处理查询结果,并且应该调用方法_fetch_function(options)

q = client.QueryDocuments(collection_link, query, {'maxItemCount':10})
results_1 = q._fetch_function({'maxItemCount':10})
#this is a string representing a JSON object
token = results_1[1]['x-ms-continuation']
results_2 = q._fetch_function({'maxItemCount':10,'continuation':token})

数据包含在results_[n][0]中,并且调用返回的标头信息在results_[n][1]中返回。

答案 2 :(得分:0)

您还可以使用fetch_next_block()在页面中获取结果。 请注意:用户代码不应公开延续令牌

q = db_source._client.QueryDocuments(collection_link, query,  {'maxItemCount': 10, 'continuation': True})
results = q.fetch_next_block()

参考:https://github.com/Azure/azure-documentdb-python/issues/98