在DynamoDB中具有同一用户的多个记录

时间:2018-06-25 17:06:05

标签: amazon-dynamodb aws-api-gateway serverless

我希望在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}

1 个答案:

答案 0 :(得分:0)

您需要的是GSI: global secondary index。在GSI中,每个分区键都没有一项限制。您可以执行以下操作:

更改主表,以使主键对每个用户请求具有唯一的值。每次需要保存用户请求时,都会生成一个新的主键,如下所示(仅作为示例):randomInteger[1:10000] + timestamp + userID。这应该足以避免两个请求具有相同的分区键。

对于每个项目,还将userID保存为单独的属性(可以是您的排序键或常规属性)。当然,还要保存您需要的所有其他属性。

在您的GSI中,将userID设置为主键。当您需要某个给定用户的所有项目时,只需在GSI(而非主表)中查询userID,即可获得所有这些信息。