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

网络袋熊

我正在构建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. 取一件物品

现在我用

Key: {
  groupId,
  actionId
}

效果很好。

  1. 通过eventId提取所有项目(操作)

SQL:

SELECT * FROM theTable WHERE eventId = 123

如果我执行此本地索引,则效果很好:

KeySchema:
  - AttributeName: groupId
    KeyType: HASH
  - AttributeName: eventId
    KeyType: RANGE
  1. 提取所有具有groupId的,由createdAt日期排序为actionType ='trigger'的项目(与eventId无关)

SQL:

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

这是给我的问题。我想查询我的数据并返回按日期排序的数据。但是,我需要使用另一个字段作为RANGE进行查询。因此,如果我将createdAt添加为我的范围,则无法使用actionType进行过滤。如果我使用actionType,则没有排序。

我如何最好地构造这张桌子?在数据方面。可以有多个组(groupId)。每个组可以有许多事件(eventId)。但是每个事件可能只包含<100个动作(actionId)。

马修·波普

为了像SELECT * FROM theTable WHERE actionType = 'trigger' AND groupId = 123 SORT BY createdAtDynamoDB中那样实现查询,您需要具有一个索引,该索引的哈希键为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 AND begins_with(actionTypeCreatedAt, "trigger_")DynamoDB将自动按排序键对结果进行排序,并且由于所有查询结果都具有相同的actionType前缀,因此将仅按createdAt日期对结果进行排序

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不指定分区键值的情况下查询 DynamoDB?

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

如何在不更改查询的情况下对条形图进行排序?

如何在不损失结果范围的情况下将C中的uint转换为int

如何在不知道 Enum 本身的情况下对 Enum.GetValues 的结果进行排序

sql 如何在不添加列的情况下按联合的子查询排序?

如何在不扩展轴范围的情况下进行绘图?

如何在不更改原始数组的情况下对数组进行排序?

如何在不创建中间 Seq 的情况下对 Iterable 进行排序?

熊猫 如何在不更改索引的情况下对DataFrame进行排序?

如何在不创建DataView的情况下对DataTable行进行排序?

如何在不更改熊猫其他列的情况下对一列进行排序?

如何在不创建表的情况下将动态查询的结果存储在临时表中?

如何在不循环的情况下按 LINQ 查询结果分组到 DataGridView

如何在不执行几个连续查询的情况下对其进行解释?

如何在不运行SELECT COUNT(*)查询的情况下对行计数进行计数?

如何在不枚举数据的情况下进行异步查询?

如何在不排序的情况下从对象输出数组

如何在不排序的情况下取消堆叠?

如何在不指定final的情况下访问变量?

如何在不递归的情况下进行ls

如何在不写select的情况下进行分组

如何在不指定表的列名的情况下将动态循环的结果存储到临时表中?

如何在不连续重复 Javascript 中的两个特定属性的情况下对对象数组进行排序?

如何在不更改相同值红宝石位置的情况下按降序对哈希进行排序

Matlab-如何在不丢失行名的情况下对条形图的行进行排序?

如何在不更改其他级别顺序的情况下按一个级别对MultiIndex进行排序

如何在不更改其他元素索引的情况下对数组中的元素进行排序?

Java如何在不扩展比较器的情况下对包含句点/点的字符串数组进行排序?