从ExecuteStoredProcedureAsync获取100多个文档

时间:2017-12-20 21:58:08

标签: c# azure azure-cosmosdb

我有一个使用SQL / DocumentDB接口的CosmosDB实例。我通过.NET SDK访问它。

我有使用ExecuteStoredProcedureAsync调用的存储过程。但我最多只能获得100份文件。我知道这是默认选项。我可以改变吗?

ExecuteStoredProcedureAsync的可选参数是RequestOptions对象。 RequestOptions没有MaxItemCount或continuation令牌的属性。

2 个答案:

答案 0 :(得分:1)

您需要更改SP本身以调整您想要返回的记录数量。以下是SP-

中实现的跳过/接受逻辑的完整示例
function storedProcedure(continuationToken, take){

     var filterQuery = "SELECT * FROM ...";
     var accept = __.queryDocuments(__.getSelfLink(), filterQuery, {pageSize: take, continuation: continuationToken},

     function (err, documents, responseOptions) {
         if (err) throw new Error("Error" + err.message);

         __.response.setBody({
             result: documents,
             continuation: responseOptions.continuation
         });
     });
}

这是相应的C#代码:

        string continuationToken = null;
        int pageSize = 500;

        do
        {
            var r = await client.ExecuteStoredProcedureAsync<dynamic>(
                UriFactory.CreateStoredProcedureUri(DatabaseId, CollectionId, "SP_NAME"),
                new RequestOptions { PartitionKey = new PartitionKey("...") },
                continuationToken, pageSize);

            var documents = r.Response.result;
            // processing documents ...
            // 'dynamic' could be easily substituted with a class that will cater your needs

            continuationToken = r.Response.continuation;
        }
        while (!string.IsNullOrEmpty(continuationToken));       

如您所见,有一个参数可以控制要发回的记录数 - pageSize 。正如您所注意到的,默认情况下pageSize为100。如果您需要一次返回所有内容,请指定-1。

答案 1 :(得分:0)

  

RequestOptions没有MaxItemCount或者属性   继续令牌。

MaxItemCount是Feedoptions中的参数。

ExecuteStoredProcedureAsync方法不限制返回的数据条目,关键是您在存储过程中的查询操作设置了要返回的最大条目数。

请参阅以下示例存储过程代码:

function sample(prefix) {
    var collection = getContext().getCollection();



    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT * FROM root r',
       { pageSize: 1000 },
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            var body = "";
            for(var i=0 ; i<feed.length;i++){
                body +="{"+feed[i].id+"}";
            }
            response.setBody(JSON.stringify(body));
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

结果:

enter image description here