我遇到了一个关于我编写的存储过程的问题,以便将批量更新/删除作为单个事务执行。 SP是:
function UpdatePages(pageList)
{
// If no pages were given, end right now.
if (!pageList) throw new Error("Input page list cannot be null");
//getting the collection
var collection = getContext().getCollection();
// Check to see that there are pages to update.
if (pageList.length > 0)
{
// Loop through each page and determine what to do.
pageList.forEach(function (page)
{
// If there is a self link of a page to delete, perform the deletion.
if (page.SelfLinkOfPageToDelelte != null)
{
DeletePage(collection, page.SelfLinkOfPageToDelelte);
}
// Otherwise, If this is a special page, perform an update.
else if (page.ExistingSpecialPage != null)
{
UpdateExistingPage(collection, page.ExistingSpecialPage);
}
// Otherwise, this is just a regular page, perform a update as appropriate
else
{
UpdateExistingPage(collection, page.ExistingPage);
}
});
// If we've made it this far, we've succeeded.
getContext().getResponse().setBody("Success");
}
// If there aren't any, we shouldn't have called this. Throw an error.
else
{
throw new Error("No pages found to update/delete.");
}
}
// Function for performing an update on an existing Document with the version stored in memory.
function UpdateExistingPage(collection, page)
{
// Gather information about the DocumentDB Resource
var docToReplace = page.Doc;
var requestOptions = { etag: docToReplace._etag };
// Perform a replace (using the ETag for comparison)
collection.replaceDocument(docToReplace._self, page.Obj, requestOptions, function (err)
{
if (err)
{
var customError = new Error();
customError.name = err.number;
customError.message = err.message;
throw customError;
}
});
}
// Function for performing a page deletion, given the self link.
function DeletePage(collection, pageSelfLink)
{
collection.deleteDocument(pageSelfLink, {}, function (err)
{
if (err)
{
var customError = new Error();
customError.name = err.number;
customError.message = err.message;
throw customError;
}
});
}
我正在尝试更新的网页包含一个较小的项目列表;我对这个数量的上限设置了上限,以便我从未达到~2ishMB文件大小限制,并且代码(C#)根据需要处理内存中页面的拆分/添加,然后调用此SP来更新Azure Cosmos DB随着变化。上面逻辑中显示的“特殊”页面与此处描述的页面相同,但在页面本身上有一些int / boolean / string字段。
在我用来验证我的分裂逻辑工作的测试用例中,有2个注意事项。第一个涉及创建页面,尝试向其添加5000个项目,并调用commit。第二个涉及加载一个特殊页面,它已经包含3000个项目,并调用commit。调用commit的行为将执行页面拆分,并且我将页面大小设置为1250以进行测试。因此,我希望看到第一个案例共创建4个页面(每个页面中包含1250个项目),第二个案例是将初始页面更新为仅包含1250个页面并创建两个新页面(一个1250,另一个500)。
第一案,通过就好了;一切都按预期工作。
然而,第二种情况失败并出现错误:
(HttpStatusCode = 413): Message: {"Errors":["Request size is too large"]}
这让我感到困惑,考虑到第一种情况我发送的请求比第二种情况要大。
我的同事和我认为它可能与我们正在更新的文档所处的初始状态有关。当我的代码创建页面时,它会在Cosmos DB中创建空白页面,并返回新创建的文档从中。对页面所做的任何更改都将保留在内存中,直到调用提交为止。 因此,在第一种情况下,我们有一个空白页面,我们正在替换,而在第二种情况下,我们正在尝试替换更大的文件。
我找不到关于我在存储过程中使用的javascript类的大量文档(除了列出的here),所以我想知道是否有人遇到任何类似的问题,或者是否任何人都有关于如何解决这个问题的建议。任何帮助将不胜感激!