【问题标题】:DynamoDB filter if primary key contains value如果主键包含值,则 DynamoDB 过滤器
【发布时间】:2020-10-18 03:10:25
【问题描述】:

目前

我在 DynamoDB 中有一个表,其中包含一个属性 - 主键 - 包含唯一值。

PK
------
#A#B#C#
#B#C#
#C#D#E#
#BC#

问题

我希望对 #B#C# (1) 完全匹配和 (2) 包含匹配进行 2 次搜索,因此只需要结果:

(1) Exact Match:
#B#C#

(2) Containing Match:
#A#B#C#
#B#C#
  1. 是否可以针对主键进行这 2 次搜索?
  2. 如果是这样,运行最有效的查询是什么?例如查询或扫描

注意:

对于 (2) 我使用以下代码,但它返回 DB 中的所有项目:

            params = {
                TableName: 'myTable',
                FilterExpression: "contains(#key, :v)",
                ExpressionAttributeNames: { "#key": "PK" },
                ExpressionAttributeValues: { ":v": #B#C# }
            }

            dynamodb.scan(params,callback)

【问题讨论】:

    标签: amazon-dynamodb dynamodb-queries


    【解决方案1】:

    DynamoDB 支持两种主要类型的搜索:查询和扫描。 Query 操作根据主键值查找项目。 Scan 操作通过访问表或二级索引中的每个项目返回一个或多个项目和项目属性

    如果您想查找具有主键#B#C 的项目,您可以使用query API

    ddbClient.query(
      {
        "TableName": "<YOUR TABLE NAME>",
        "KeyConditionExpression": "#pk = :pk",
        "ExpressionAttributeValues": {
          ":pk": {
            "S": "#B#C"
          }
        },
        "ExpressionAttributeNames": {
          "#pk": "PK"
        }
      }
    )
    
    

    对于您的第二种访问模式,您需要使用扫描 API,因为您正在搜索整个表/二级索引。

    您可以使用扫描来测试主键是否具有使用contains 的子字符串。我认为您的扫描操作格式没有任何问题。

    以这种方式使用扫描时要小心。因为扫描会读取整个表以获取结果,所以大规模的操作效率会相当低。如果此操作不经常运行,或者您正在针对稀疏索引运行它,则可能没问题。但是,如果它是您的主要访问模式之一,您可能需要重新考虑使用扫描 API 进行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-19
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-12-08
      • 2019-06-24
      • 1970-01-01
      • 2021-02-13
      相关资源
      最近更新 更多