如何仅通过 DynamoDB 中组合键的一部分进行查询?

2024-04-18

比方说,我有User正在写评论Products.

用户和产品是具有自己的 id 的独立实体。

Review是一个复合实体,由以下组成userId and productId.

我创建了一个表review在 DynamoDB 中同时具有userId and productId作为哈希键。

aws dynamodb create-table --table-name review \
  --attribute-definitions \
      AttributeName=user_id,AttributeType=S \
      AttributeName=product_id,AttributeType=S \
  --key-schema \
      AttributeName=user_id,KeyType=HASH \
      AttributeName=product_id,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=10,WriteCapacityUnits=5 

从而使得userId+productId复合键。

评论数据对象是根据该密钥保存的。

查询用户和产品的评论是可以的。

但是如何查询用户的所有评论或产品的所有评论呢?

使用单个参数,例如如果我通过单键条件表达式进行查询"#user_id = :userId"要不就"#product_id = :productId"

我收到表格错误

Query condition missed key schema element: user_id

or

Query condition missed key schema element: product_id

我在 DynamoDB 中创建了一个表审核,其中 userId 和 ProductId 作为 HASH 键。

您已为查看表创建了一个复合主键,其中包含以下分区键userId和一个排序键 'productId' 。你做到了not创建两个 HASH 键。

从逻辑上讲,您的评论表将如下所示(为了说明目的,我编造了一些数据):

这种表结构可以很容易地获取用户的评论。这是查询所有评论的示例USER#ABC

ddbClient.query(
  "TableName": "<YOUR TABLE NAME>",
  "KeyConditionExpression": "#userId = :userId",
  "ExpressionAttributeValues": {
    ":userId": {
      "S": "USER#ABC"
    }
  },
  "ExpressionAttributeNames": {
    "#userId": "userId"
  }
)

这将返回由 USER#ABC 审阅的项目集合。

DynamoDB 将not允许您通过以下方式获取项目only指定排序键(例如productId)。你always需要提供分区键。那么如何获得评论过给定产品的用户列表呢?

如果您想搜索评论过单个产品的所有用户,您可以引入一个全局二级索引来交换表的分区键和排序键。这种模式被称为倒排索引 https://aws.amazon.com/getting-started/hands-on/design-a-database-for-a-mobile-app-with-dynamodb/5/#:%7E:text=An%20inverted%20index%20is%20a,primary%20key%20for%20your%20table.。使用上面的示例,倒排索引将如下所示:

这将允许您通过 ProductId 获取用户:

ddbclient.query(
{
  "TableName": "<YOUR TABLE NAME>",
  "IndexName": "reviews_by_product_index",
  "KeyConditionExpression": "#productId = :productId",
  "ExpressionAttributeValues": {
    ":productId": {
      "S": "PRODUCT#456"
    }
  },
  "ExpressionAttributeNames": {
    "#productId": "productId"
  }
}
)

此查询将返回代表评论的两个项目的集合PRODUCT#456.

使用复合主键时,您can根据条件进行搜索sort key只要您还指定分区键。这有点拗口,但它允许您执行类似(伪代码)的查询

查询其中分区键=“USER#ABC”且排序键begins_with“Product”

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何仅通过 DynamoDB 中组合键的一部分进行查询? 的相关文章

随机推荐