Azure cosmosdb 文档数据库5秒存储过程执行限制
我有一个返回4000个文档的存储过程,由于5秒的执行限制,我的存储过程不会重新调整任何数据。我试图处理集合接受值,但它没有按预期工作 我尝试将响应设置为“return”,以防达到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
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