AWS DynamoDB 查询数组中的值
AWS DynamoDB querying with values in an array
具有以下(Table名称:“Table”):
[
{
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
NAME#name1
VALUE#val1
VALUE#val1
NAME#name1
NAME#name1
VALUE#val2
VALUE#val2
NAME#name1
NAME#name1
VALUE#val3
VALUE#val3
NAME#name1
NAME#name2
VALUE#val1
VALUE#val1
NAME#name2
PK 和 SK 是基 table 的分区和排序键,并且有一个全局二级索引“GSI1”,其中 GSI1PK 作为分区,GSI1SK 作为排序键。
按名称获取所有值 会像这样:
Query(KeyConditionExpression: PK = "NAME#<name>")
这是一个包含所有值的 returns 列表。
按值获取所有名称 可以这样做:
Query(KeyConditionExpression: GSI1PK = "VALUE#<value>", Index: GSI1)
这个 returns 所有名字的列表。
这种模式称为倒排索引,原则上您也可以定义分区键为 SK,排序键为 PK 的全局二级索引,以避免属性重复。
NAME#
和 VALUE#
前缀也可以省略,但如果您使用单个 table 设计,这是一个很好的做法。
我设法使用 aws-sdk
中的 .scan()
方法使其工作。
const attributName = "values";
const attributeValue = "string1";
docClient.scan({
TableName: "Table",
ExpressionAttributeValues: {
":attribute": attributeValue,
},
FilterExpression: `contains(${attributName}, :attribute)`,
});
具有以下(Table名称:“Table”):
[
{
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 |
---|---|---|---|
NAME#name1 | VALUE#val1 | VALUE#val1 | NAME#name1 |
NAME#name1 | VALUE#val2 | VALUE#val2 | NAME#name1 |
NAME#name1 | VALUE#val3 | VALUE#val3 | NAME#name1 |
NAME#name2 | VALUE#val1 | VALUE#val1 | NAME#name2 |
PK 和 SK 是基 table 的分区和排序键,并且有一个全局二级索引“GSI1”,其中 GSI1PK 作为分区,GSI1SK 作为排序键。
按名称获取所有值 会像这样:
Query(KeyConditionExpression: PK = "NAME#<name>")
这是一个包含所有值的 returns 列表。
按值获取所有名称 可以这样做:
Query(KeyConditionExpression: GSI1PK = "VALUE#<value>", Index: GSI1)
这个 returns 所有名字的列表。
这种模式称为倒排索引,原则上您也可以定义分区键为 SK,排序键为 PK 的全局二级索引,以避免属性重复。
NAME#
和 VALUE#
前缀也可以省略,但如果您使用单个 table 设计,这是一个很好的做法。
我设法使用 aws-sdk
中的 .scan()
方法使其工作。
const attributName = "values";
const attributeValue = "string1";
docClient.scan({
TableName: "Table",
ExpressionAttributeValues: {
":attribute": attributeValue,
},
FilterExpression: `contains(${attributName}, :attribute)`,
});