当前位置: 首页 > 知识库问答 >
问题:

DynamoDB|如何在不指定分区密钥的情况下按排序顺序查询所有记录

孟沛
2023-03-14

我正在使用AWS DynamoDB来存储Web应用程序的用户会话记录。

每条记录的格式如下:

uuid  timestamp  type

在哪里

  • uuid是一个用户id和分区键

在我们的管理员仪表板中,我想显示一个包含最新XX个会话的表,首先显示最新会话。

问:使用AWS DynamoDB,如何按排序顺序和定义的限制查询所有会话

需要使用查询指定分区键

扫描不会按排序顺序返回结果

我看到的所有解决方案似乎都有点“黑客”,我怀疑我误解了什么,因为这个用例一定很常见。

我知道这个黑客解决方案:

  1. 为具有相同值的所有行定义变量
  2. 创建二级索引并将变量设置为分区键,将时间戳设置为sortkey
  3. 查询此辅助索引(现在所有行都有相同的分区键)

我不是DynamoDB方面的专家,但这种解决方案似乎是一种黑客行为,并且与DynamoDB架构背道而驰。

共有1个答案

鲍国兴
2023-03-14

您有一大堆选项可以在Dynamo中实现这一点,所有这些看起来都很糟糕,因为您的仪表板用例不是DynamoDB优化的对象。

以下是一些选项:

>

  • 存储另一条分区键为“activesessions”的记录。此记录包含活动会话的分区键数组。一条dynamo记录可以存储400kb的数据,因此您可以在这一条记录中存储数千个活动会话密钥(如果需要更多,可以分页)。缺点是,在添加和删除会话时,您必须维护这个“activesessions”记录。

    扫描-您说这些记录没有排序,但是您可以在从dynamo检索后在代码中排序。这基本上就是dynamo对过滤器表达式所做的:

    在已读取项之后应用FilterExpress;过滤过程不消耗任何额外的读取容量单位。

    扫描的缺点-它不缩放并且使用大量的读取容量。只有当您的总会话数保证很小(最多几千个)时,我才会使用它。

    您建议的选项可以工作,但是您仍然应该尝试为您的记录提供一个尽可能唯一的密钥。与其仅使用相同的分区密钥存储它们,不如使用“samvalue-todaysdate”等格式使其更加独特。这样,您的查询将能够比搜索每个会话更快地找到特定日期的会话。

    不要使用dynamodb-使用AWS RDS:mySQL、SQL server等。

  •  类似资料:
    • 问题内容: 我有此代码,但仅适用于小写字母。我希望它在不考虑大写字母的情况下对列表进行排序。 问题答案: 这是最佳方法的简单Java示例:

    • 我正在构建一个DynamoDB表,并且遇到了如何最好地构建索引的问题。我需要执行3个查询。 我的桌子: 以下是我需要实现的3个查询: 获取单个项目 现在我做一个getItem 作品伟大。 SQL: 如果我做这个本地索引,那么效果很好: SQL: 这是一个给我带来麻烦的问题。我想查询我的数据,并将其按日期排序返回。但是,我需要使用另一个字段作为范围进行查询。因此,如果我添加createdAt作为我的

    • 问题内容: 假设我有一个查询“ select * from子句,其中id在(0,2,5,1,3)中”,我实际上希望返回的行以它们在where子句中指定的相同顺序返回。ID的顺序将随查询的不同而改变,并且该顺序没有模式。 我知道可以更改数据模型,创建临时表等。但是请相信我,这些类型的解决方案在我的情况下将行不通。我也无法在应用程序代码中更改结果对象的顺序。 我还知道,不同的数据库引擎对事物的排序方式

    • 我有一个具有两个属性的dynamoDB表: A: 主分区键 B: 主排序键 我想使用属性B查询这个表,因为我不知道A的值。可以这样做吗? 是否可以将B设为GSI(全局二级索引),如何使用B查询表,因为B已经是排序键。

    • 我是AWS DynamoDB的新手,需要这里专家的指导。 我正在创建一个应用程序,它将显示一个事件列表,条件是事件日期必须大于今天的日期,并按事件日期降序。我的表架构如下所示: 分区键=eventid 排序键=eventdate 如果我使用关系数据库,我可以使用“SELECT*From事件,其中eventdate

    • 问题内容: 如何在不同情况下( 大写 和 小写 )对带有varchar2列的表进行排序? 例如,当我按“名称”列进行排序时,将得到以下结果: 我想要的是这样的: 问题答案: 使用,例如 如果您需要解决非英语语言的特殊字符,则可能需要有关NLSSORT的其他答案。如果您不这样做,我会尝试和KISS一起使用,因为它很容易记住和使用,并被他人阅读(可维护性)。