查询Azure Cosmos db中不同文档的最新数据(SQL)

Query last data of different documents in Azure Cosmos db (SQL)

示例数据:

{age: 20, ts: '00:00'},
{age: 20, ts: '00:01'},
{age: 30, ts: '00:00'},
{age: 30, ts: '00:01'},
{age: 40, ts: '00:00'},
{age: 40, ts: '00:01'},
{age: 40, ts: '00:02'}

预期输出:

[{age: 20, ts: '00:01'},
{age: 30, ts: '00:01'},
{age: 40, ts: '00:02'}]

尝试过

SELECT * FROM c where c.age in (20, 30, 40) order by c.ts desc

但是结果选择了所有数据

请尝试如下操作:

SELECT max(c.ts) as ts, c.age FROM c where c.age in (20, 30, 40) 
Group By c.age

这给出了以下输出:

[
    {
        "ts": "00:02",
        "age": 40
    },
    {
        "ts": "00:01",
        "age": 30
    },
    {
        "ts": "00:01",
        "age": 20
    }
]

(仅适用于大量数据)

我不会在 CosmosDb 中处理过于复杂的查询,请注意 RU 可能会非常快地飙升(以及您的每月账单)。

糟糕的是你的问题没有显示你的背景(这是为了 UI,为了报告......)。

我可能会建议使用 Cosmos 触发器来持续生成此数据。

AgesDetail (current table)
{age: 20, ts: '00:00'},
{age: 20, ts: '00:01'},
{age: 30, ts: '00:00'},
{age: 30, ts: '00:01'},
{age: 40, ts: '00:00'},
{age: 40, ts: '00:01'},
{age: 40, ts: '00:02'}

当记录被替换或添加时,更新一个新的table

AgesMax
{id: 20, ts: '00:01'},
{id: 30, ts: '00:01'},
{di: 40, ts: '00:02'}

这会缩短您的阅读时间,并且肯定会降低您的阅读量。

您还可以将此应用到您的代码层,以将消息发送到队列中以获取和转换数据。

无论如何,我认为建议仍然有效。将您的读数与真实读数分开 table 以获得更好的性能并更具成本效益。