我正在构建一个分析工具,我正在使用 Azure function 和 Azure Cosmos 来做后端。
该工具正在运行,但某些小部件太重,需要从 Cosmos 检索太多数据。因此,我没有从 Cosmos 获取大量数据,然后在前端(javascript)解析这些数据,而是得出的结论是我需要做相反的事情。但这些查询在 SQL 中管理起来相当复杂。
基本拓扑是当访问者开始观看视频时,我创建了一个“播放”类型的日志(Cosmos DB 中的条目)。稍后我可以获取一段时间内的所有“播放”日志,并在 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 上按日期分组的真正清晰的信息。
您可以尝试一次下面的查询,它可能会根据属性略有不同,但可以用于通过计数进行分组。只是添加日期应该匹配,包括时间戳,以便下面的查询正常工作,否则计数可能会有所不同。
更新:
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 中相应地使用这些数据。