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

如何在不指定范围键值的情况下对DynamoDB查询结果排序

董良策
2023-03-14

我正在构建一个DynamoDB表,并且遇到了如何最好地构建索引的问题。我需要执行3个查询。

我的桌子:

AttributeDefinitions:
  # This is large groups that can have many events
  - AttributeName: groupId
    AttributeType: S
  # An event can have many actions
  - AttributeName: eventId
    AttributeType: S
  # Each item has a unique actionId
  - AttributeName: actionId
    AttributeType: S
  # Each item has a creation date
  - AttributeName: createdAt
    AttributeType: S
  # Some type I need to filter by (enum: trigger|task for example)
  - AttributeName: actionType
    AttributeType: S

# Main query to return items by action ID - that works fine
KeySchema:
  - AttributeName: groupId
    KeyType: HASH
  - AttributeName: actionId
    KeyType: RANGE

以下是我需要实现的3个查询:

  1. 获取单个项目

现在我做一个getItem

Key: {
  groupId,
  actionId
}

作品伟大。

SQL:

SELECT * FROM theTable WHERE eventId = 123

如果我做这个本地索引,那么效果很好:

KeySchema:
  - AttributeName: groupId
    KeyType: HASH
  - AttributeName: eventId
    KeyType: RANGE

SQL:

SELECT * FROM theTable WHERE actionType = 'trigger' AND groupId = 123 SORT BY createdAt

这是一个给我带来麻烦的问题。我想查询我的数据,并将其按日期排序返回。但是,我需要使用另一个字段作为范围进行查询。因此,如果我添加createdAt作为我的范围,我就不能使用actionType进行过滤。如果我使用actionType,那么就没有排序。

如何最好地构建这个表?就数据数量而言。可以有很多组(groupId)。每个组可以有很多事件(eventId)。但是每个事件很可能只有

共有1个答案

鲁鸿
2023-03-14

为了在DynamoDB中实现像SELECT*From theTable WHERE actionType='触发器'AND groupId=123 SORT BY createdAt这样的查询,您需要有一个具有groupId哈希键的索引和一个复合排序键actionTypeCreatedAt(可以预见,它是actionType、分隔符,然后是createdAt日期)。

在索引中,数据如下所示(假定排序键中的分隔符为“\”):

groupId | actionTypeCreatedAt
--------|------------------------------
    123 | trigger_2019-06-30T08:30:00Z
    123 | trigger_2019-07-05T23:00:00Z
    123 | trigger_2019-07-20T10:15:00Z
    123 | action2_2019-06-25T15:10:00Z
    123 | action2_2019-07-08T02:45:00Z

现在,要实现您想要的查询,您需要使用groupId=123 ANDbegins_with(actionTypeCreatedAt,"trigger_")的关键条件表达式。DynamoDB将自动按排序键对结果进行排序,并且由于所有查询结果都具有相同的actionType前缀,因此结果将仅按createdAt日期排序。

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

  • 如有任何帮助,不胜感激

  • 我正在使用AWS DynamoDB来存储Web应用程序的用户会话记录。 每条记录的格式如下: 在哪里 uuid是一个用户id和分区键 在我们的管理员仪表板中,我想显示一个包含最新XX个会话的表,首先显示最新会话。 问:使用AWS DynamoDB,如何按排序顺序和定义的限制查询所有? 需要使用查询指定分区键 扫描不会按排序顺序返回结果 我看到的所有解决方案似乎都有点“黑客”,我怀疑我误解了什么,因

  • 问题内容: 为了掌握AngularJS,我决定使用其中一个示例,特别是在Todo示例中简单地添加一个“ complete”屏幕,当用户输入5个todo时,它会使用一个切换案例切换到另一个div。 。如果有任何用处,可以在这里找到代码http://jsfiddle.net/FWCHU/1/。 但是,似乎每个开关盒都有其自己的作用域($ scope.todoText不可用),但是在这种情况下,可以使用

  • 我有一个DynamoDB表,其中包含主键:userID、排序键:sesionID和另一列,该列名为示例ID。 我想返回一个列表,该列表返回所有包含我发送的userID和examID的记录。这是我的代码: 这就是我得到的错误:{“statusCode”:500,“body”:“{”error“:“查询条件缺少关键架构元素:sessionId”}”, ... 我想也许我应该包括一个过滤器表达式,或者不

  • 我在使用AWS Boto3使用推荐的KeyConditionExpression同时使用哈希键和范围键查询DynamoDB时遇到问题。我附上了一个查询示例: 当我对具有以下方案的表运行此操作时: 我发现以下错误,我无法理解原因: 根据我的理解,类型M是映射或字典类型,我使用的类型N是数字类型,与我的范围键表方案相匹配。如果有人能解释为什么会发生这个错误,或者我也愿意用不同的方式完成相同的查询,即使