使用带分区键和范围键的LSI查询Dynamodb
问题描述:
在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" ....)
答
按照实施例给出的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不起作用。 –
我和我原来的问题的编辑不同意,我问具体如何与分区键和键值范围列表查询。这个问题的题目失去了这种区别。查询给定分区键和单个范围键是支持的,但不查询范围键值列表,这就是我要求的 –