如果主键包含值,则 DynamoDB 过滤器

DynamoDB filter if primary key contains value

当前

我在 DynamoDB 中有一个 table 具有单个属性 - 主键 - 包含唯一值。

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

问题

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

(1) Exact Match:
#B#C#

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

注:

对于 (2),我正在使用以下代码,但它返回了数据库中的所有项目:

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

            dynamodb.scan(params,callback)

DynamoDB 支持两种主要类型的搜索:查询和扫描。查询操作根据主键值查找项目。通过访问 table 或二级索引

中的每个项目,扫描操作 returns 一个或多个项目和项目属性

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

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

对于第二个访问模式,您需要使用扫描 API,因为您要搜索整个 table/secondary 索引。

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

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