如何在Azure Cosmos DB中按日期分组数据?



我正在构建一个分析工具,我使用Azure功能和Azure Cosmos来做后端。

该工具正在工作,但一些小部件太重,需要从Cosmos检索太多数据。因此,与其从Cosmos获取大量数据,然后在前端(javascript)解析这些数据,我得出的结论是,我需要做相反的事情。但是在SQL中管理这些查询是相当复杂的。

基本的拓扑是当访问者开始观看视频时,我有一个类型为"播放"的日志。创建的条目(Cosmos DB中的条目)。稍后我可以取回所有的"play"记录一段时间的日志,并在Javascript中操作数据以获得每分钟播放的次数,如下所示:

const results = [
"2021-04-15T15:47:34": 3,
"2021-04-15T15:47:35": 7,
"2021-04-15T15:47:36": 2,
"2021-04-15T15:47:37": 13,
//and so on
]

然后我使用这些数据制作一个图表,显示每分钟播放的次数

我在Azure中使用的查询是:

SELECT c.id,c.date,c.type FROM c WHERE c.liveId = "{ID}" AND c.type = "Play" AND (c.date BETWEEN "2021-06-04T12:31:30.233Z" AND "2021-07-31T21:59:59.999Z")

它返回给我:

{
"id": "0eef48c0-a797-4461-8d59-0a8a5d546c1c",
"date": "2021-04-15T12:35:29.118Z",
"type": "Load"
},
{
"id": "b52b0a35-99ab-4e17-a2d3-9f638501c97f",
"date": "2021-04-15T12:35:29.164Z",
"type": "Load"
},
{
"id": "ce2d5326-06a9-4d0b-9eb2-8cede6ada7eb",
"date": "2021-04-15T12:35:29.164Z",
"type": "Load"
},
{
"id": "dd0a225c-1806-4c08-a5a4-c65f092e3928",
"date": "2021-04-15T12:35:29.187Z",
"type": "Load"
},

是否有办法在Cosmos中构建这样的查询来获得:

const results = [
"2021-04-15T15:47:34": 3,
"2021-04-15T15:47:35": 3,
"2021-04-15T15:47:36": 3,
"2021-04-15T15:47:37": 3,
//and so on
]

直接从查询?

我搜索了一下,但没有找到任何关于Cosmos上按日期分组的真正明确的内容。

您可以尝试下面的查询一次,它可能会根据属性有所不同,但可以用来做group by with count。仅添加日期应匹配包括时间戳的下面的查询工作,否则计数可能不同。

更新:

select d.newdate,d.cnt  from
(SELECT left(c.date,16) as newdate,count(c.date) as cnt FROM c
WHERE c.type = 'Load' and (c.date between '2021-03-04T12:31:30.233Z' AND '2021-07-31T21:59:59.999Z')
group by left(c.date,16)) d

更新结果():

[
{
"newdate": "2021-04-15T12:35",
"cnt": 7
},
{
"newdate": "2021-04-15T12:36",
"cnt": 3
}
]

然后你可以在JavaScript中使用这些数据。

最新更新