首页 > 解决方案 > 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 中获取所有项目,然后使用我自己的方法进行查询?

谢谢大家!

标签: amazon-web-servicesamazon-dynamodbaws-sdk-nodejs

解决方案


对于该查询模式,您可能应该重新考虑您的数据模型,我建议如下:

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#


推荐阅读