2017-02-28 63 views
2

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

如何使用分区键值和范围键值查询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" ....) 
+0

我和我原来的问题的编辑不同意,我问具体如何与分区键和键值范围列表查询。这个问题的题目失去了这种区别。查询给定分区键和单个范围键是支持的,但不查询范围键值列表,这就是我要求的 –

回答

0

按照实施例给出的Local Search Indexes - PHP Low Level API AWS文献,

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

  • sortKeyName =:sortkeyval - 如果排序键值等于:sortkeyval。
  • sortKeyName <:sortkeyval - 如果排序关键字值小于:sortkeyval,则返回true。
  • sortKeyName < =:sortkeyval - 如果排序关键字值小于或等于:sortkeyval,则返回true。
  • sortKeyName>:sortkeyval - 如果排序关键字值大于:sortkeyval,则返回true。
  • sortKeyName> =:sortkeyval - 如果排序关键字值大于或等于:sortkeyval,则为true。
  • sortKeyName BETWEEN:sortkeyval1 AND:sortkeyval2 - 如果排序关键字值大于或等于:sortkeyval1且小于 或等于sortkeyval2,则为true。
  • starts_with(sortKeyName,:sortkeyval) - 如果排序键值以特定操作数开头,则为true。 (您不能使用此功能 与是Number类型排序关键字。)

注意,函数名BEGINS_WITH是区分大小写的。

因此,只有支持范围。 没有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' 
]); 
+0

好的谢谢你的确认。由于表中可能存在项目bar1,bar2,bar3,bar4,但参数列表可能只包含[bar1,bar2,someotherId],所以starts_with不起作用。 –

相关问题