gpt4 book ai didi

azure - Azure 上的 DocumentDb - 我无法在一次运行中获取完整的记录集?

转载 作者:行者123 更新时间:2023-12-03 03:11:49 25 4
gpt4 key购买 nike

对于一个应用程序,我创建了一个在 AzureDB 上运行的 JavaScript 存储过程,这样我可以获得一组全面的汇总,然后我可以在屏幕上显示。

但是计数总是关闭,似乎我从未获得完整的记录集。

所以我做了一个测试。我创建了以下存储过程:

function trialRun(startDateTime, endDateTime)
{
var context = getContext();
var collection = context.getCollection();
var response = context.getResponse();

var sqlString = "select p.id, p.ClientId, p.ActionType, a.Action, a.TimeStamp "
+ "from History p"
+ " join a in p.Actions "
+ "where a.TimeStamp >= '" + startDateTime + "' "
+ " and a.TimeStamp <= '" + endDateTime + "' ";

// Query documents
var isAccepted = collection.queryDocuments(collection.getSelfLink(), sqlString,
function (err, feed, options)
{
if (!err)
{
response.setBody(JSON.stringify(feed));
}
else
{
throw err;
}
});

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

事实上,输出丢失了 10 条记录。

我读过有关分页的内容等等...但到目前为止我还没有找到与此问题相关的任何内容。

这里有人可以引导我走向正确的方向吗?也许有一个关于如何从下一个“页面获取数据”的示例代码?

最佳答案

首先提出一个建议。如果您所做的只是查询,那么最好使用客户端 SDK 和/或 documentdb-utils (这只是 Azure 提供的 SDK 的包装器)。存储过程内的查询不会使用辅助节点并限制您的整体吞吐量。来自客户端 SDK 的查询将使用辅助数据库并且性能更高。另一方面,如果您将一堆行聚合为一个结果,那么存储过程可能是最好的,具体取决于。

也就是说,即使您将聚合移动到存储过程中,您也会遇到同样的问题。因此,要解决这个问题,您可能需要查看 documentdb-utils 中的示例之一。从 countDocuments 开始存储过程。另外,您可能想了解编写可重新启动的存储过程的模式,发现 here .

我怀疑您缺少的关键概念是,在 NoSQL 世界中,尤其是 JavaScript,您需要异步思考并编写代码,以便可以中断和重新启动。

假设您可以将聚合需求移至存储过程中,则所需的更改包括:

  1. 当系统停止接受请求时不要抛出错误。相反,保存当前的执行状态并包含存储过程需要重新启动的指示符。我链接到的 countDocuments 示例使用stillQueueing。如果您使用 documentdb-utils,这将告诉它存储过程尚未完成,需要再次调用。

  2. 将第三个参数添加到 requestOptionsqueryDocuments() 调用中,并将其中的 pageSize 设置为 1000。1000 就很大了足够大,这样您就不会进行大量的数据库往返,但又足够小,可以在系统返回 false(表明不再对请求进行排队)但在存储过程强制超时之前对其进行处理。

  3. 当页面进入时进行聚合,将结果累积到您将返回的正文中。

  4. 您不需要 JSON.stringify() 响应。他们的系统将负责编码纯 JavaScript 对象。

  5. 无论如何,不​​要将整个提要都放在您的回复中。只有您的聚合。

  6. 捕获回调的第三个 options 参数中找到的继续 token ,并将其与您的响应一起传回。

如果您确实想使用存储过程并返回所有行,而不是客户端 SDK 或仅进行聚合的存储过程,那么我需要警告您不要使用 documentdb-utils。如果您将整个提要放入响应中,它将尝试在每次往返中来回发送它,并很快超过存储过程调用或返回的最大有效负载。不过,您可以使用原始 SDK,并确保在返回另一次调用之前删除提要内容。

关于azure - Azure 上的 DocumentDb - 我无法在一次运行中获取完整的记录集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36530351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com