Azure CosmosDB 查询资源管理器与数据资源管理器
Azure CosmosDB Query Explorer vs Data Explorer
我运行对我的 CosmosDB 实例执行相同的查询(使用 SQL API):
SELECT c.partition, COUNT(1) AS total
FROM c
WHERE c.system = "SF"
GROUP BY c.partition
我有点惊讶我从 Data Explorer 得到了预期的结果,而在 Query Explorer 选项卡下我得到了400 错误请求 带有以下消息:
{"code":400,"body":"{\"code\":\"BadRequest\",\"message\":\"Message: {\"Errors\":[\"Cross partition query only supports 'VALUE ' for aggregates.\"]}\r\nActivityId: d8523615-c2ff-47cf-8102-5256237c7024, Microsoft.Azure.Documents.Common/2.7.0\"}","activityId":"d8523615-c2ff-47cf-8102-5256237c7024"}
我知道我可以使用第一个,但是当我尝试 运行 来自 Logic Apps 的查询时出现同样的异常:
所以问题很简单:该查询在语法上是否正确?
根据您的要求,我想我们可以尝试在您的逻辑应用程序中使用 azure 函数来代替 "Query documents V2" 操作。
这是我的函数代码:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
namespace HuryCosmosFun
{
public static class Function1
{
[FunctionName("Function1")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[CosmosDB(
databaseName: "ToDoList",
collectionName: "Items",
SqlQuery = "SELECT c.partition, COUNT(1) AS total FROM c WHERE c.system = 'SF' GROUP BY c.partition",
ConnectionStringSetting = "CosmosDBConnection")]
IEnumerable<ResultsClass> results,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
foreach (ResultsClass result in results)
{
log.LogInformation(result.partition);
log.LogInformation(result.total.ToString());
}
return new OkResult();
}
}
}
namespace HuryCosmosFun
{
public class ResultsClass
{
public string partition { get; set; }
public int total { get; set; }
}
}
上面的代码可以参考这个tutorial.
发布到azure后,我们可以create an azure function in logic app,它会帮我们做sql操作
顺便说一下,自从这个tutorial提到的azure cosmos db sdk已经支持"group by"。
我觉得我们也可以在这个document中通过sdk在azure function中编写代码来连接和查询cosmos db,然后在logic app中创建azure function作为第一种解决方案。
希望对您的需求有所帮助~
我运行对我的 CosmosDB 实例执行相同的查询(使用 SQL API):
SELECT c.partition, COUNT(1) AS total
FROM c
WHERE c.system = "SF"
GROUP BY c.partition
我有点惊讶我从 Data Explorer 得到了预期的结果,而在 Query Explorer 选项卡下我得到了400 错误请求 带有以下消息:
{"code":400,"body":"{\"code\":\"BadRequest\",\"message\":\"Message: {\"Errors\":[\"Cross partition query only supports 'VALUE ' for aggregates.\"]}\r\nActivityId: d8523615-c2ff-47cf-8102-5256237c7024, Microsoft.Azure.Documents.Common/2.7.0\"}","activityId":"d8523615-c2ff-47cf-8102-5256237c7024"}
我知道我可以使用第一个,但是当我尝试 运行 来自 Logic Apps 的查询时出现同样的异常:
所以问题很简单:该查询在语法上是否正确?
根据您的要求,我想我们可以尝试在您的逻辑应用程序中使用 azure 函数来代替 "Query documents V2" 操作。
这是我的函数代码:
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
namespace HuryCosmosFun
{
public static class Function1
{
[FunctionName("Function1")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
[CosmosDB(
databaseName: "ToDoList",
collectionName: "Items",
SqlQuery = "SELECT c.partition, COUNT(1) AS total FROM c WHERE c.system = 'SF' GROUP BY c.partition",
ConnectionStringSetting = "CosmosDBConnection")]
IEnumerable<ResultsClass> results,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
foreach (ResultsClass result in results)
{
log.LogInformation(result.partition);
log.LogInformation(result.total.ToString());
}
return new OkResult();
}
}
}
namespace HuryCosmosFun
{
public class ResultsClass
{
public string partition { get; set; }
public int total { get; set; }
}
}
上面的代码可以参考这个tutorial.
发布到azure后,我们可以create an azure function in logic app,它会帮我们做sql操作
顺便说一下,自从这个tutorial提到的azure cosmos db sdk已经支持"group by"。
我觉得我们也可以在这个document中通过sdk在azure function中编写代码来连接和查询cosmos db,然后在logic app中创建azure function作为第一种解决方案。
希望对您的需求有所帮助~