如何在 Azure Cosmos DB 中按日期对数据进行分组?
How to group data by date in Azure Cosmos DB?
我正在构建一个分析工具,我正在使用 Azure 函数和 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")
它returns我:
{
"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中相应地使用这些数据了。
我正在构建一个分析工具,我正在使用 Azure 函数和 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")
它returns我:
{
"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中相应地使用这些数据了。