在 DynamoDB 中为同一用户拥有多个记录
To have multiple records for same user in DynamoDB
我希望在 DynamoDB 中为 uname(同一用户)创建多条记录,但当我执行 POST 请求时记录会更新。我希望为同一用户而不是一个记录多个记录。
即:在具有所有属性的 POST 方法之后,记录得到更新而不是生成新记录。
在 GET 请求中:'url/uname' 只给出一条记录。
我想获得多条记录,我该如何实现?
service: Test1
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"
provider:
name: aws
runtime: python3.6
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
functions:
create:
handler: create.create
events:
- http:
path: form
method: post
cors: true
list:
handler: list.list
events:
- http:
path: form
method: get
cors: true
get:
handler: get.get
events:
- http:
path: form/{uname}
method: get
cors: true
resources:
Resources:
TodosDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: uname
AttributeType: S
KeySchema:
-
AttributeName: uname
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 10
WriteCapacityUnits: 10
TableName: ${self:provider.environment.DYNAMODB_TABLE}
你需要的是 GSI: global secondary index。在 GSI 中,没有限制每个分区键一个项目。您可以执行以下操作:
更改您的主 table 以便主键对于每个用户请求具有唯一值。每次需要保存用户请求时,都会像这样生成一个新的主键(仅举个例子):randomInteger[1:10000] + timestamp + userID
。这应该足以避免两个请求具有相同的分区键。
对于其中的每一项,还将用户 ID 保存为单独的属性(可以是您的排序键或常规属性)。当然,还要保存你需要的所有其他属性。
在您的 GSI 中,将用户 ID 设置为主键。当您需要来自给定用户的所有项目时,只需查询 GSI(不是主 table)的用户 ID,您将获得所有项目。
我希望在 DynamoDB 中为 uname(同一用户)创建多条记录,但当我执行 POST 请求时记录会更新。我希望为同一用户而不是一个记录多个记录。 即:在具有所有属性的 POST 方法之后,记录得到更新而不是生成新记录。
在 GET 请求中:'url/uname' 只给出一条记录。
我想获得多条记录,我该如何实现?
service: Test1
# You can pin your service to only deploy with a specific Serverless version
# Check out our docs for more details
# frameworkVersion: "=X.X.X"
provider:
name: aws
runtime: python3.6
environment:
DYNAMODB_TABLE: ${self:service}-${opt:stage, self:provider.stage}
iamRoleStatements:
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
functions:
create:
handler: create.create
events:
- http:
path: form
method: post
cors: true
list:
handler: list.list
events:
- http:
path: form
method: get
cors: true
get:
handler: get.get
events:
- http:
path: form/{uname}
method: get
cors: true
resources:
Resources:
TodosDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: uname
AttributeType: S
KeySchema:
-
AttributeName: uname
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 10
WriteCapacityUnits: 10
TableName: ${self:provider.environment.DYNAMODB_TABLE}
你需要的是 GSI: global secondary index。在 GSI 中,没有限制每个分区键一个项目。您可以执行以下操作:
更改您的主 table 以便主键对于每个用户请求具有唯一值。每次需要保存用户请求时,都会像这样生成一个新的主键(仅举个例子):randomInteger[1:10000] + timestamp + userID
。这应该足以避免两个请求具有相同的分区键。
对于其中的每一项,还将用户 ID 保存为单独的属性(可以是您的排序键或常规属性)。当然,还要保存你需要的所有其他属性。
在您的 GSI 中,将用户 ID 设置为主键。当您需要来自给定用户的所有项目时,只需查询 GSI(不是主 table)的用户 ID,您将获得所有项目。