【问题标题】:Querying DynamoDB with many records to get results with contains使用许多记录查询 DynamoDB 以获取包含的结果
【发布时间】:2021-12-26 13:49:34
【问题描述】:

我们有一个 DynamoDB 表:

resource "aws_dynamodb_table" "prospectmaterials_table" {
  name              = "drinks"
  hash_key          = "PK"
  billing_mode      = "PAY_PER_REQUEST"
  read_capacity     = 5
  write_capacity    = 5
  
  attribute {
    name = "PK"
    type = "S"
  }
}

目前包含 36,000 条记录。

其中包含的数据示例:

PK Name Description Price
Coke-Coke Cola-Classic beverage-1.00 Coke Cola Classic beverage 1.00
Pepsi-Pepsi Cola-Another beverage-1.00 Pepsi Cola Another beverage 1.00
Dr. Pepper-Dr. Pepper-Yet another beverage-2.00 Dr. Pepper Yet another beverage 2.00

我们想要检索所有在Description 字段中包含单词“beverage”的约 1000 条记录。

通过 API 网关端点,我们要查询表以检索包含“饮料”的每条记录。此查询当前因“KeyConditionExpression 中使用的无效运算符:包含”而中断:

{
    "TableName": "drinks",
    "ConsistentRead": true,
    "ExpressionAttributeValues": {
        ":m": {
            "S": "beverage"
        }
    },
    "KeyConditionExpression": "contains(PK,:m)"
}

我应该如何构造这个查询,以便它快速执行并返回我需要的所有记录?

【问题讨论】:

  • DynamoDB 是不适合这项工作的工具,您无法设计您的表以使其能够正常工作。 DynamoDB 是一个键值对存储,您正在执行一个完全不同的查询。对于每个包含查询,您最终都会扫描整个数据库。要使您当前的请求正常工作,您实际上可能需要执行 Scan 而不是 Query
  • 由于数据量大或我想使用contains 条件查询而导致错误的工具?
  • 因为要运行的查询。 DynamoDB 无法正确回答包含查询。如果您运行一个返回 5 个元素的查询,然后根据包含将该数据集过滤为 2 个元素,那么您就可以了。但是目前必须扫描每个请求的所有数据。这可能适用于少量数据,但已经很臭了,并且会在性能/延迟方面破坏大量数据。
  • “给我所有 user123 的订单,昨天发生的,其中包含一个名称中包含 'iPad' 的项目”如果您正确分区并按用户 ID 和订单日期排序,则很容易回答,“给我所有不包含名称中包含“iPad”的商品的订单”。
  • 为什么它不能正确回答包含查询?如果我要将数据分成更多的分区然后运行查询,那会更有意义吗?如果我理解你的意思,Dynamo 似乎不是最适合典型的 NoSQL DB 用例。

标签: amazon-web-services nosql amazon-dynamodb aws-api-gateway


【解决方案1】:

不支持您尝试使用的 CONTAINS 操作作为带有查询 API 的 KeyConditionExpression 中的操作。唯一可用的KeyConditionExpressionsEQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN (see docs)。最重要的是,除了EQ 之外的所有这些操作都保留给排序键。对于查询操作,您必须指定单个分区,即在您查询的分区键上使用= 运算符。这意味着您不仅需要重组您的密钥以实现以下访问模式:

我们想要检索在描述字段中包含单词“饮料”的所有约 1000 条记录。

您可能还必须更改访问模式本身。使用 DynamoDB 更可行的方法可能是:

我们要检索所有具有 typebeverage 的 ~1000 个项目

这是因为分区键上的相等性是您对基表执行的每个查询操作的先决条件

如果您无法更改表的结构方式,那么 DynamoDB 可能不是适合这项工作的工具。不过,如果可以的话,肯定有一些方法可以评估和塑造数据,以便在一般情况下使用 NoSQL tablesDynamoDB specifically

最好的方法是布置所有您的访问模式,查阅 AWS 提供的最佳实践文档(之前链接),并围绕您的主要模式设计您的基表,同时利用二级索引必要时补充次要模式。

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多