带过滤器的 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 有两个不同但相似的操作 - QueryScan:

  • Scan 用于读取整个 table,包括所有分区键。
  • Query 用于读取特定的分区键 - 以及其中的所有排序键(或排序键的连续 range - 因此绰号“范围键”对于那个键)。

如果您的数据模型没有范围键,Query 与您无关 - 您应该使用 Scan

然而,这意味着每次调用此查询时,都会读取整个 table。除非您的 table 很小,否则这在经济上没有意义,您应该重新考虑您的数据模型。例如,如果您经常通过“partner”属性查找结果,您可以考虑创建一个以“partner”为分区键的GSI(global secondary index),让您快速便宜地获取具有给定“伙伴”值的项目列表,而无需扫描整个 table.