Amazon dynamodb 如何在DynamoDB中仅通过复合键的一部分进行查询?

Amazon dynamodb 如何在DynamoDB中仅通过复合键的一部分进行查询?,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,比如说,我让用户撰写产品评论 用户和产品是具有各自ID的独立实体 Review是一个实体,其复合id由userId和productId组成 我已经在DynamoDB中创建了一个以userId和productId作为散列键的表审阅 aws dynamodb create-table --table-name review \ --attribute-definitions \ AttributeName=user_id,AttributeType=S \ Attribu

比如说,我让用户撰写产品评论

用户和产品是具有各自ID的独立实体

Review是一个实体,其复合id由userId和productId组成

我已经在DynamoDB中创建了一个以userId和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

我已经在DynamoDB中创建了一个以userId和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排序键组成。您没有创建两个哈希键

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 
从逻辑上讲,您的审阅表将类似于下面的内容。为了便于说明,我编造了一些数据:

这种表结构便于用户获取评论。下面是一个查询USERABC所有评论的示例

这将返回由USERABC审核的项目集合

DynamoDB将不允许您仅通过指定排序键(例如productId)来获取项目。您始终需要提供分区密钥。那么,您如何获得一份已审阅给定产品的用户列表呢

如果您想搜索查看过单个产品的所有用户,可以引入一个全局二级索引来交换表的分区键和排序键。这种模式被称为一种模式。使用上面的示例,反向索引如下所示:

这将允许您按productId获取用户:

ddbclient.query(
{
  "TableName": "<YOUR TABLE NAME>",
  "IndexName": "reviews_by_product_index",
  "KeyConditionExpression": "#productId = :productId",
  "ExpressionAttributeValues": {
    ":productId": {
      "S": "PRODUCT#456"
    }
  },
  "ExpressionAttributeNames": {
    "#productId": "productId"
  }
}
)
此查询将返回两个项目的集合,表示PRODUCT456的评论

使用复合主键时,只要还指定了分区键,就可以基于排序键的条件进行搜索。这很简单,但它允许您执行伪代码中的查询

查询其中partition key=USERABC和sort key以PRODUCT开头

我已经在DynamoDB中创建了一个以userId和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排序键组成。您没有创建两个哈希键

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 
从逻辑上讲,您的审阅表将类似于下面的内容。为了便于说明,我编造了一些数据:

这种表结构便于用户获取评论。下面是一个查询USERABC所有评论的示例

这将返回由USERABC审核的项目集合

DynamoDB将不允许您仅通过指定排序键(例如productId)来获取项目。您始终需要提供分区密钥。那么,您如何获得一份已审阅给定产品的用户列表呢

如果您想搜索查看过单个产品的所有用户,可以引入一个全局二级索引来交换表的分区键和排序键。这种模式被称为一种模式。使用上面的示例,反向索引如下所示:

这将允许您按productId获取用户:

ddbclient.query(
{
  "TableName": "<YOUR TABLE NAME>",
  "IndexName": "reviews_by_product_index",
  "KeyConditionExpression": "#productId = :productId",
  "ExpressionAttributeValues": {
    ":productId": {
      "S": "PRODUCT#456"
    }
  },
  "ExpressionAttributeNames": {
    "#productId": "productId"
  }
}
)
此查询将返回两个项目的集合,表示PRODUCT456的评论

使用复合主键时,只要还指定了分区键,就可以基于排序键的条件进行搜索。这很简单,但它允许您执行伪代码中的查询

查询其中partition key=USERABC和sort key以PRODUCT开头


您能显示给出错误的完整查询吗?您能显示给出错误的完整查询吗?