带过滤器的 DynamoDB 查询
DynamoDB Query with filter
我喜欢编写一个 dynamoDb 查询,在其中过滤特定字段,听起来很简单。
我找到的所有示例总是包含分区键值,这让我很困惑,因为它是唯一值,但我想要一个列表。
我将 id 作为分区键,没有排序键或任何其他索引。我尝试添加合作伙伴作为索引没有任何区别。
AttributeValue attribute = AttributeValue.builder()
.s(partner)
.build();
Map<String, AttributeValue> expressionValues = new HashMap<>();
expressionValues.put(":value", attribute);
Expression expression = Expression.builder()
.expression("partner = :value")
.expressionValues(expressionValues)
.build();
QueryConditional queryConditional = QueryConditional
.keyEqualTo(Key.builder()
.partitionValue("id????")
.build());
Iterator<Product> results = productTable.query(r -> r.queryConditional(queryConditional)
非常感谢任何帮助。我这边是不是有什么误解?
DynamoDB 有两个不同但相似的操作 - Query
和 Scan
:
Scan
用于读取整个 table,包括所有分区键。
Query
用于读取特定的分区键 - 以及其中的所有排序键(或排序键的连续 range - 因此绰号“范围键”对于那个键)。
如果您的数据模型没有范围键,Query
与您无关 - 您应该使用 Scan
。
然而,这意味着每次调用此查询时,都会读取整个 table。除非您的 table 很小,否则这在经济上没有意义,您应该重新考虑您的数据模型。例如,如果您经常通过“partner”属性查找结果,您可以考虑创建一个以“partner”为分区键的GSI(global secondary index),让您快速便宜地获取具有给定“伙伴”值的项目列表,而无需扫描整个 table.
我喜欢编写一个 dynamoDb 查询,在其中过滤特定字段,听起来很简单。 我找到的所有示例总是包含分区键值,这让我很困惑,因为它是唯一值,但我想要一个列表。 我将 id 作为分区键,没有排序键或任何其他索引。我尝试添加合作伙伴作为索引没有任何区别。
AttributeValue attribute = AttributeValue.builder()
.s(partner)
.build();
Map<String, AttributeValue> expressionValues = new HashMap<>();
expressionValues.put(":value", attribute);
Expression expression = Expression.builder()
.expression("partner = :value")
.expressionValues(expressionValues)
.build();
QueryConditional queryConditional = QueryConditional
.keyEqualTo(Key.builder()
.partitionValue("id????")
.build());
Iterator<Product> results = productTable.query(r -> r.queryConditional(queryConditional)
非常感谢任何帮助。我这边是不是有什么误解?
DynamoDB 有两个不同但相似的操作 - Query
和 Scan
:
Scan
用于读取整个 table,包括所有分区键。Query
用于读取特定的分区键 - 以及其中的所有排序键(或排序键的连续 range - 因此绰号“范围键”对于那个键)。
如果您的数据模型没有范围键,Query
与您无关 - 您应该使用 Scan
。
然而,这意味着每次调用此查询时,都会读取整个 table。除非您的 table 很小,否则这在经济上没有意义,您应该重新考虑您的数据模型。例如,如果您经常通过“partner”属性查找结果,您可以考虑创建一个以“partner”为分区键的GSI(global secondary index),让您快速便宜地获取具有给定“伙伴”值的项目列表,而无需扫描整个 table.