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)`,
});