COSMOS DB-查询选定分区的最新文档? [英] Cosmos DB - Query for newest document of select partitions?

查看:26
本文介绍了COSMOS DB-查询选定分区的最新文档?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

考虑具有以下文档模型的CosmosDB容器:

{
  id: <string>,
  userId: <string>, // partition key
  data: <string>
}

我需要提供具有N个用户ID的查询,并获取每个用户ID的最新文档。

例如,如果容器中有以下数据:

{ id: '1', userId: 'user1', data: 'a', _ts: 1 },
{ id: '2', userId: 'user1', data: 'b', _ts: 2 },
{ id: '3', userId: 'user2', data: 'c', _ts: 10 },
{ id: '4', userId: 'user2', data: 'd', _ts: 5 },
{ id: '5', userId: 'user3', data: 'e', _ts: 3 },
{ id: '6', userId: 'user3', data: 'f', _ts: 4 },
{ id: '7', userId: 'user4', data: 'g', _ts: 100 },
{ id: '8', userId: 'user4', data: 'h', _ts: 99 },
{ id: '9', userId: 'user5', data: 'i', _ts: 1 },
{ id: '10', userId: 'user5', data: 'j', _ts: 2 },

我想这样做:

-- This doesn't work
SELECT c.userId, (SELECT TOP 1 d.id, d.data WHERE d.userId = c.userId FROM d ORDER BY d._ts DESC) AS newest
WHERE c.userId IN ['user1', 'user2', 'user4', 'user5']

要获得此结果,请执行以下操作:

{ userId: 'user1', newest: { id: '2', data: 'b' } },
{ userId: 'user2', newest: { id: '3', data: 'c' } },
{ userId: 'user4', newest: { id: '7', data: 'g' } },
{ userId: 'user5', newest: { id: '10', data: 'j' } },

据我所知,CosmosDB中的JOIN不能用于过滤相关文档。还有没有办法做到这一点呢?我对使用存储过程持开放态度,但据我所知,存储过程的执行只能发生在给定关键字的特定分区上。在我的示例中,主要分组是分区键。

我考虑过扇出请求方法,但我可能在查询中一次查询50到100个用户ID。在这种情况下,只获取每个分区中的所有文档可能会更快,并且在迭代时只保留最新的文档--但这需要筛选很大的分页响应。

我的最后一个想法是,我可以使用asb/EventGrid/函数和另一个依赖的CosmosDB容器在每次更新文档时总是克隆最新更新的文档,但这似乎有点过头了。真的有办法构造查询来做我想做的事吗?

谢谢

推荐答案

执行此操作的一种方法是使用以下方法。

SELECT t.userid, 
       SUBSTRING(t.concat, 28,8000) AS data
FROM 
(
SELECT  c.userid,
        MAX(CONCAT(TimestampToDateTime(c._ts*1000),c.data)) AS concat
FROM c
WHERE c.userid IN ('user1', 'user2')
GROUP BY c.userid
) AS t

,返回类似

的结果
[
    {
        "userid": "user1",
        "data": "b"
    },
    {
        "userid": "user2",
        "data": "d"
    }
]

派生表t返回如下结果.

[
    {
        "userid": "user2",
        "concat": "2021-06-11T17:42:03.0000000Zd"
    },
    {
        "userid": "user1",
        "concat": "2021-06-11T17:41:41.0000000Zb"
    }
]

每个用户具有最高_ts的文档将在连接字符串中具有词典顺序最高的日期时间前缀,并使用SUBSTRING提取附加在其后面的辅助数据。

它应该能够对WHERE子句使用索引-但随后需要查看给定userid的所有文档(因此,如果每个用户有多个文档,分别对每个文档执行TOP 1查询可能会好得多)

这篇关于COSMOS DB-查询选定分区的最新文档?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆