DynamoDB:查询所有数据并按日期降序排序

时间:2017-03-08 18:40:05

标签: amazon-web-services amazon-dynamodb aws-lambda

我是AWS DynamoDB的新手,需要专家的指导。

我正在创建一个应用程序,该应用程序将显示事件列表,其中事件日期必须大于今天日期,并按事件日期降序排序。我的表架构如下:

分区键= eventid

排序键= eventdate

如果我使用关系数据库,我可以使用“SELECT * FROM events eventdate> todaydate ORDERBY eventdate DESC”,但我想如何使用AWS DynamoDB实现这一目标?我希望使用QUERY而不是SCAN。

2 个答案:

答案 0 :(得分:0)

根据DynamoDB Query API Documentation

  

查询:

     

Query操作使用表的主键或辅助索引   直接访问该表或索引中的项目。

     

使用 KeyConditionExpression 参数提供特定值   对于分区键。 Query操作将返回所有   具有该分区键值的表或索引中的项。您可以   通过指定a,可以选择缩小Query操作的范围   排序键值和KeyConditionExpression中的比较运算符。   您可以使用ScanIndexForward参数获取结果   或按逆序排序。

     

KeyConditionExpression

     

指定项目的键值的条件   通过Query操作检索。

     

条件必须对单个分区键执行相等性测试   值。该条件还可以执行几个比较测试之一   在单个排序键值上。查询可以使用KeyConditionExpression来   检索具有给定分区键值的一个项目并对键值进行排序,   或几个具有相同分区键值但不同的项目   排序键值。

     

需要分区键相等性测试,并且必须在中指定   格式如下:

     

partitionKeyName = :partitionkeyval

     

如果您还想为排序键提供条件,则必须是   使用AND与排序键的条件组合。以下是   例如,使用=比较运算符作为排序键:

     

partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

     

排序键条件的有效比较如下:

     
      
  • sortKeyName = :sortkeyval - 如果排序键值等于:sortkeyval。
  • ,则为true   
  • sortKeyName < :sortkeyval - 如果排序键值小于:sortkeyval。
  • ,则为true   
  • sortKeyName <= :sortkeyval - 如果排序键值小于或等于,则为true:sortkeyval。
  •   
  • sortKeyName > :sortkeyval - 如果排序键值大于:sortkeyval。
  • ,则为true   
  • sortKeyName >= :sortkeyval - 如果排序键值大于或等于:sortkeyval,则为true。
  •   
  • sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2 - 如果排序键值大于或等于:sortkeyval1且小于   或等于:sortkeyval2。
  •   
  • begins_with ( sortKeyName, :sortkeyval ) - 如果排序键值以特定操作数开头,则为true。 (你不能使用这个功能   使用Number类型的排序键。)
  •   
     

您可以选择使用ExpressionAttributeNames参数   用占位符替换分区键的名称和排序键   令牌。如果属性名称冲突,则可能需要此选项   使用DynamoDB保留字。例如,以下内容   KeyConditionExpression参数导致错误,因为Size是a   保留字:

Size = :myval
     

要解决此问题,请定义占位符(例如#S)来表示   属性名称大小。 KeyConditionExpression然后如下:

#S = :myval
     

有关保留字的列表,请参阅亚马逊中的保留字   DynamoDB开发人员指南。

     

有关ExpressionAttributeNames和的更多信息   ExpressionAttributeValues,请参阅使用占位符作为属性名称   和Amazon DynamoDB开发人员指南中的值。

     

类型:字符串

     

必填:否

您的方案可以转换为以下代码:

$tableName = "genericTable";
$response = $dynamodb->query([
    'TableName' => $tableName,
    'IndexName' => 'OrderCreationDateIndex',
    'KeyConditionExpression' => 'partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval',
    'ExpressionAttributeValues' =>  [
        ':partitionkeyval' => ['S' => 'pkey'],
        ':sortkeyval' => ['S' => 'sortkey']
    ],
    'Select' => 'ALL_PROJECTED_ATTRIBUTES',
    'ScanIndexForward' => false,
    'ConsistentRead' => true,
    'Limit' => 5,
    'ReturnConsumedCapacity' => 'TOTAL'
]);

答案 1 :(得分:-1)

不幸的是,您无法使用Query API实现上述用例。

<强>原因: -

  • 您需要大于比较运算符。可以在FilterExpression上使用非相等性比较运算符,或使用KeyConditionExpression在排序键属性上使用。

  • 在上述用例中,您没有eventId,因此您无法使用 KeyConditionExpression。即使使用eventDate作为哈希键创建GSI,也不能对哈希键使用非相等运算符,并且除Sort键之外的任何属性都不能进行排序。因此,您无法使用GSI选项实现排序要求。

针对上述用例使用查询API的变通方法解决方案: -

  • 使用散列密钥eventDate

  • 创建GSI
  • 使用查询API按eventDate

  • 查询索引
  • 在客户端按eventDate对数据进行排序。大多数编程语言都有很好的排序API。您可以在客户端轻松实现此目的

注意: -

  • 您无法实现排序和使用查询API要求,尤其是在不知道主表的哈希键的情况下