我正在使用Azure Cosmos DB SQL API尝试实现以下目标;
我们将设备数据存储在一个集合中,并且希望有效地检索每个设备序列的最新事件数据,而不必对每个设备分别进行N次查询。
SELECT *
FROM c
WHERE c.serial IN ('V55555555','synap-aim-g1') ORDER BY c.EventEnqueuedUtcTime DESC
我假设我需要使用分组依据-https: //docs.microsoft.com/zh-cn/azure/cosmos-db/sql-query-group-by
任何帮助将不胜感激
粗略的数据示例:
[
{
"temperature": 25.22063251827873,
"humidity": 71.54208429695204,
"serial": "V55555555",
"testid": 1,
"location": {
"type": "Point",
"coordinates": [
30.843687,
-29.789895
]
},
"EventProcessedUtcTime": "2020-09-07T12:04:34.5861918Z",
"PartitionId": 0,
"EventEnqueuedUtcTime": "2020-09-07T12:04:34.4700000Z",
"IoTHub": {
"MessageId": null,
"CorrelationId": null,
"ConnectionDeviceId": "V55555555",
"ConnectionDeviceGenerationId": "637323979596346475",
"EnqueuedTime": "2020-09-07T12:04:34.0000000"
},
"Name": "admin",
"id": "6dac491e-1f28-450d-bf97-3a15a0efaad8",
"_rid": "i2UhAI7ofAo3AQAAAAAAAA==",
"_self": "dbs/i2UhAA==/colls/i2UhAI7ofAo=/docs/i2UhAI7ofAo3AQAAAAAAAA==/",
"_etag": "\"430131c1-0000-0100-0000-5f5621d80000\"",
"_attachments": "attachments/",
"_ts": 1599480280
}
]
更新:因此,执行以下操作将返回正确的数据,但可悲的是,您只能返回组内或聚合函数内的数据(即不能选择*)
SELECT c.serial, MAX(c.EventProcessedUtcTime)
FROM c
WHERE c.serial IN ('V55555555','synap-aim-g1')
GROUP BY c.serial
[
{
"serial": "synap-aim-g1",
"$1": "2020-09-09T06:29:42.6812629Z"
},
{
"serial": "V55555555",
"$1": "2020-09-07T12:04:34.5861918Z"
}
]
如果问题确实是针对这种特定查询场景的有效方法,那么在查询语言本身无法提供有效解决方案的情况下,我们可以考虑使用非规范化。关于分区和建模的本指南中有一个有关获取Feed中最新项目的相关章节。
我们只需要获取100个最新帖子,而无需对整个数据集进行分页。
因此,为了优化最后一个请求,我们在设计中引入了第三个容器,该容器完全致力于满足该请求。我们将发布的信息规范化到该新的供稿容器。
按照这种方法,您可以创建一个专用于“最新”查询的“ Feed”或“ LatestEvent”容器,该容器使用设备序列作为id
并具有单个分区键,以确保只有一个(最新)事件每个设备的项目,并且可以使用简单的查询通过设备序列号获取或以最低的成本列出该项目:
SELECT *
FROM c
WHERE c.serial IN ('V55555555','synap-aim-g1')
更改提要可用于更新最新事件,以便在主事件中创建最新事件时在“ LatestEvent”容器中创建/覆盖最新事件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句