使用聚合运行查询时,我收到以下异常:
Microsoft.Azure.Documents.BadRequestException:
{"Errors":["Cross partition query only supports 'VALUE <AggreateFunc>' for aggregates."]}
---> System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A0B00
Run Code Online (Sandbox Code Playgroud)
我的查询代码是:
var store = "1234";
var sumResults = client.CreateDocumentQuery(
UriFactory.CreateDocumentCollectionUri("my-data-db", "my-collection"),
$"SELECT SUM(t.totalAmount) FROM t where t.siteData.siteID = '{store}'");
Run Code Online (Sandbox Code Playgroud)
当构建平台设置为x86但设置为x64时失败,我花了一段时间才发现这种方法很好.
我正在使用最新版本的1.12.2软件包
有关如何使x64版本工作的任何想法?
根据你的描述,我使用了Microsoft.Azure.DocumentDB 1.12.2在 DocommentDB 模拟器和 Azure DocumentDB 上测试类似的查询。经过一番试验,我发现只有当您对 DocomentDB 模拟器(我当前的版本是 1.11.136.2)使用 SQL 聚合函数(例如 COUNT、MIN、MAX、SUM 和 AVG)并且您的项目构建在 x64 上时,才会出现此问题。
正如此官方文档提到的有关 Azure DocumentDB 的聚合:
聚合支持已推广到所有 DocumentDB 生产数据中心。您可以开始对现有 DocumentDB 帐户运行聚合查询,或通过 SDK、REST API 或 Azure 门户预配新的 DocumentDB 帐户。但是,您必须下载最新版本的SDK才能执行跨分区聚合查询或在 .NET 中使用 LINQ 聚合运算符。
我假设您可以通过 LINQ 来利用聚合,如下所示:
var amount=client.CreateDocumentQuery<DocEntity>("/dbs/{your-db-id}/colls/{your-collection-id}",
new FeedOptions { MaxDegreeOfParallelism = -1 })
.Where(r => r.siteID == "1234")
.Sum(r=>r.totalAmount);
Run Code Online (Sandbox Code Playgroud)
我们可以发现上面的查询会生成以下查询:
{"query":"SELECT VALUE Sum(root[\"totalAmount\"]) FROM root WHERE (root[\"siteID\"] =\"1234\") "}
有关更多详细信息,您可以参考此教程。