amazon-web-services - AWS DynamoDB 使用数组中的值进行查询
问题描述
使用以下内容(表名:“表”):
[
{
name: "name1",
values: ["string1", "string2"]
},
{
name: "name2",
values: ["string1", "string2", "string3"]
}
]
我的分区键是name
,没有任何排序键。我正在尝试查询具有相同value
字段的所有项目。以下是我尝试过的:
docClient.query({
TableName: "Table",
KeyConditionExpression: "name = :name",
FilterExpression: "contains(values, :value)",
ExpressionAttributeValues: {
":name": "certain_name",
":value": "string1",
},
});
假设我想查询所有value
字段为“string1”的项目。但是,AWS DynamoDB 要求partition key
我的所有项目都是唯一的。有什么方法可以查询具有相同value
字段的所有项目,而不用担心partition key
?
或者更好的方法是从 DynamoDB 中获取所有项目,然后使用我自己的方法进行查询?
谢谢大家!
解决方案
对于该查询模式,您可能应该重新考虑您的数据模型,我建议如下:
PK | SK | GSI1PK | GSI1SK |
---|---|---|---|
名称#name1 | 价值#val1 | 价值#val1 | 名称#name1 |
名称#name1 | 价值#val2 | 价值#val2 | 名称#name1 |
名称#name1 | 价值#val3 | 价值#val3 | 名称#name1 |
名称#name2 | 价值#val1 | 价值#val1 | 名称#name2 |
PK 和 SK 是基表的分区和排序键,并且有一个全局二级索引“GSI1”,其中 GSI1PK 作为分区,GSI1SK 作为排序键。
按名称获取所有值将是这样的:
Query(KeyConditionExpression: PK = "NAME#<name>")
这将返回所有值的列表。
按值获取所有名称可以这样完成:
Query(KeyConditionExpression: GSI1PK = "VALUE#<value>", Index: GSI1)
这将返回所有名称的列表。
这种模式称为倒排索引,原则上您也可以定义全局二级索引,分区键为 SK,排序键为 PK,以免重复属性。
和前缀也可以省略,但如果您使用单表设计,这是一个很好的做法NAME#
。VALUE#