使用带有分区键和范围键的LSI查询Dynamodb

时间:2017-02-28 00:32:21

标签: amazon-dynamodb

在DynamoDB中,我使用分区键和范围键配置了LSI(本地二级索引)。

如何使用分区键值和范围键值查询DynamoDB表?

在SQL中,我可以使用 IN 运算符:

SELECT *
  FROM genericTable
 WHERE partionKey = "foo"
   AND rangeKey IN ("bar1", "bar11", "bar5")

如何在DynamoDB中实现此功能?

按照Documentation of Amazon query

  

查询可以使用KeyConditionExpression来检索...几个项目   具有相同分区键值但具有不同排序键值的值。

然而,在有效比较运算符列表中,没有类似于SQL“IN”的内容。

有没有办法使用多个关键条件表达式,如下面的SQL?

SELECT *
  FROM genericTable
 WHERE partionKey = "foo"
   AND (rangeKey = "bar1"
    OR rangeKey = "bar5" ....)

1 个答案:

答案 0 :(得分:0)

根据Local Search Indexes - PHP Low Level API的AWS文档中给出的示例,

  

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

     
      
  • 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。
  •   
  • starts_with(sortKeyName,:sortkeyval) - 如果排序键值以特定操作数开头,则为true。 (你不能使用这个功能   使用Number类型的排序键。)
  •   
     

注意,函数名称starts_with区分大小写。

因此,范围仅支持 AND 没有OR 。您也可以尝试使用 starts_with

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

$tableName = "genericTable";
$response = $dynamodb->query([
    'TableName' => $tableName,
    'IndexName' => 'OrderCreationDateIndex',
    'KeyConditionExpression' => 'partionKey = :p_key and begins_with(rangekey, :range)',
    'ExpressionAttributeValues' =>  [
        ':p_key' => ['S' => 'foo'],
        ':range' => ['S' => 'bar']
    ],
    'Select' => 'ALL_PROJECTED_ATTRIBUTES',
    'ScanIndexForward' => false,
    'ConsistentRead' => true,
    'Limit' => 5,
    'ReturnConsumedCapacity' => 'TOTAL'
]);