【发布时间】: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