Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure cosmosdb 文档数据库5秒存储过程执行限制_Azure Cosmosdb - Fatal编程技术网

Azure cosmosdb 文档数据库5秒存储过程执行限制

Azure cosmosdb 文档数据库5秒存储过程执行限制,azure-cosmosdb,Azure Cosmosdb,我有一个返回4000个文档的存储过程,由于5秒的执行限制,我的存储过程不会重新调整任何数据。我试图处理集合接受值,但它没有按预期工作 我尝试将响应设置为“return”,以防达到5秒的限制,存储过程没有设置响应 function getRequirementNodes() { var context = getContext(); var response = context.getResponse(); var collection = context.getCollection(); va

我有一个返回4000个文档的存储过程,由于5秒的执行限制,我的存储过程不会重新调整任何数据。我试图处理集合接受值,但它没有按预期工作

我尝试将响应设置为“return”,以防达到5秒的限制,存储过程没有设置响应

function getRequirementNodes() 
{
var context = getContext();
var response = context.getResponse();
var collection = context.getCollection();
var collectionLink = collection.getSelfLink();
var nodesBatch = [];
var continueToken= true;

var query = { query: 'SELECT * from root '};

getNodes(null)

function getNodes(continuation)
{
   var requestOptions = {continuation: continuation};
   var accepted = collection.queryDocuments(collectionLink, query,    requestOptions,
   function(err, documentsRead, responseOptions) 
   {
    if (documentsRead.length > 0)
    {
        nodesBatch = nodesBatch.concat(documentsRead);
    }
    else if (responseOptions.continuation)
    {
       continueToken = responseOptions.continuation
       nodesBatch = nodesBatch.concat(documentsRead);
       getNodes(responseOptions.continuation);
    }
        else 
        {
            continueToken= false;
            response.setBody(nodesBatch);
        }
        });

    if (!accepted) 
    { 
       response.setBody("return");
    } 
}
}

脚本返回空响应,因为包含
response.setBody()
的块从未被调用

我会解释的。让我们将
queryDocuments
callback的这一部分分解如下:

if(documentsRead.length>0){
nodesBatch=nodesBatch.concat(documentsRead);
}else if(responseOptions.continuation){
continueToken=responseOptions.continuation
nodesBatch=nodesBatch.concat(documentsRead);
getNodes(responseOptions.continuation);
}否则{
continueToken=false;
响应。setBody(nodesBatch);
}
请注意,如果查询的结果在第一页内(很可能会在第一页内)。。。脚本将把查询结果附加到
nodesBatch

if(documentsRead.length>0){
nodesBatch=nodesBatch.concat(documentsRead);
}
然后脚本将完成。响应主体未设置(为空),如果存在延续令牌,脚本不会发出后续查询

假设集合不是空的,那么这可能就是您正在经历的行为


注意:如果查询大型数据集,可能会达到响应大小限制(1 MB)

我重新编写了脚本来解决上述问题,并包含了一个片段来说明如何处理响应大小限制:

函数getRequirementNodes(continuationToken){ var context=getContext(); var response=context.getResponse(); var collection=context.getCollection(); var collectionLink=collection.getSelfLink(); var nodesBatch=[]; var lastContinuationToken; var responseSize=0; 变量查询={ 查询:“从根目录中选择*” }; getNodes(continuationToken); 函数getNodes(continuationToken){ //调整页面大小以适合您的数据集。 var请求选项={ continuation:continuationToken, 页面大小:1 }; var accepted=collection.queryDocuments(collectionLink、query、requestOptions、, 功能(错误、文档读取、响应选项){ //当前查询响应页的大小。 var querypage size=JSON.stringify(documentsRead).length; //DocumentDB的响应大小限制为1 MB。 if(responseSize+queryPageSize<1024*1024){ //将查询结果追加到NodeBatch。 nodesBatch=nodesBatch.concat(documentsRead); //跟踪响应大小。 responseSize+=查询页面大小; if(responseOptions.continuation){ //如果有延续标记…请再次运行查询以获取下一页的结果 lastContinuationToken=responseOptions.continuation; getNodes(responseOptions.continuation); }否则{ //如果没有Continuation令牌,则完成。返回响应。 回应({ “消息”:“查询已成功完成”, “queryResponse”:nodesBatch }); } }否则{ //如果达到响应大小限制,请使用lastContinuationToken作为脚本参数再次运行脚本。 回应({ “消息”:“已达到响应大小限制。”, “lastContinuationToken”:lastContinuationToken, “queryResponse”:nodesBatch }); } }); 如果(!接受){ //如果达到执行限制,请使用lastContinuationToken作为脚本参数再次运行脚本。 回应({ “消息”:“已达到执行限制。”, “lastContinuationToken”:lastContinuationToken, “queryResponse”:nodesBatch }); } } }
脚本返回一个空响应,因为从未调用包含
response.setBody()
的块

我会解释的。让我们将
queryDocuments
callback的这一部分分解如下:

if(documentsRead.length>0){
nodesBatch=nodesBatch.concat(documentsRead);
}else if(responseOptions.continuation){
continueToken=responseOptions.continuation
nodesBatch=nodesBatch.concat(documentsRead);
getNodes(responseOptions.continuation);
}否则{
continueToken=false;
响应。setBody(nodesBatch);
}
请注意,如果查询的结果在第一页内(很可能会在第一页内)。。。脚本将把查询结果附加到
nodesBatch

if(documentsRead.length>0){
nodesBatch=nodesBatch.concat(documentsRead);
}
然后脚本将完成。响应主体未设置(为空),如果存在延续令牌,脚本不会发出后续查询

假设集合不是空的,那么这可能就是您正在经历的行为


注意:如果查询大型数据集,可能会达到响应大小限制(1 MB)

我重新编写了脚本来解决上述问题,并包含了一个片段来说明如何处理响应大小限制:

函数getRequirementNodes(continuationToken){ var context=getContext(); var response=context.getResponse(); var collection=context.getCollection(); var collectionLink=collection.getSelfLink(); var nodesBatch=[]; var lastContinuationToken; var responseSize=0; 变量查询={ 查询:“从根目录中选择*” }; getNodes(continuationToken); 函数getNodes(continuationToken){ //调整页面大小以适合您的数据集。 var请求选项={ continuation:continuationToken, 页面大小:1 }; var=c