【问题标题】:How to Delete Multiple Items from a DynamoDB Table in Go如何在 Go 中从 DynamoDB 表中删除多个项目
【发布时间】:2021-03-10 09:13:28
【问题描述】:

我有一个包含以下项目的 DynamoDB 表:

type AuthEntry struct {
    UserID    string    `dynamodbav:"userId"`
    Token     string    `dynamodbav:"token"`
    CreatedOn time.Time `dynamodbav:"createdOn"`
}

我需要删除所有早于 5 分钟(CreatedOn Token 为空)的所有 AuthEntry 项目。我很清楚如何一次删除一个项目......但我想知道如何一次删除多个项目。非常感谢。

【问题讨论】:

  • 不,这不适用于 aws-sdk-go-v2...
  • 您能进一步解释一下吗?据我所知,aws-sdk-go-v2 主要是增强了模块化……Seth 的反应很好,也很相似。

标签: go amazon-dynamodb


【解决方案1】:

我正在寻找一个像下面这样的例子......我希望它可以帮助像我这样的其他新手。例如,首先我使用Scan 检索过期条目,然后运行BatchWriteItemInput 实际删除它们。

import (
    "context"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"

)

var tableName = "USER_AUTH"

...

type AuthRepository struct {
    ctx context.Context
    svc *dynamodb.Client
}

...

func NewAuthRepository(ctx context.Context) (*AuthRepository, error) {
    cfg, err := config.LoadDefaultConfig(ctx)
    if err != nil {
        return nil, err
    }

    return &AuthRepository{ctx, dynamodb.NewFromConfig(cfg)}, nil
}

...

func (r *AuthRepository) Collect(maxAge int) (int32, error) {
    t := time.Now().Add(time.Duration(maxAge*-1) * time.Millisecond).UTC()
    params := &dynamodb.ScanInput{
        TableName:            aws.String(tableName),
        ProjectionExpression: aws.String("userId"),
        ExpressionAttributeValues: map[string]types.AttributeValue{
            "t": &types.AttributeValueMemberS{*aws.String(t.String())},
        },
        FilterExpression: aws.String("createdOn < :t"),
    }

    result, err := r.svc.Scan(r.ctx, params)
    if err != nil {
        return 0, err
    }

    wr := make([]types.WriteRequest, result.Count)
    for _, v := range result.Items {
        authEntry := &AuthEntry{}
        if err := attributevalue.UnmarshalMap(v, &authEntry); err != nil {
        return 0, err
        }
        wr = append(wr, types.WriteRequest{
            DeleteRequest: &types.DeleteRequest{
                Key: map[string]types.AttributeValue{
                    "userId": &types.AttributeValueMemberS{*aws.String(authEntry.UserID)},
                },
            }})
    }

    input := &dynamodb.BatchWriteItemInput{
        RequestItems: map[string][]types.WriteRequest{
            tableName: wr,
        },
    }

    _, err = r.svc.BatchWriteItem(r.ctx, input)
    return result.Count, nil
}

【讨论】:

    【解决方案2】:

    在删除方面,您有几个选择。

    deleteItem - 按主键删除表中的单个项目。

    batchWriteItem - BatchWriteItem 操作在一个或多个表中放置或删除多个项目。一次 BatchWriteItem 调用最多可写入 16 MB 数据,其中可包含多达 25 个放置或删除请求

    TimeToLive - 您可以利用 DynamoDB 的生存时间 (TTL) 功能删除不再需要的项目。请记住,TTL 只会将您的项目标记为删除,实际删除可能需要长达 48 小时。

    我不确定您表中的哪些项目是主键的一部分,因此很难给您举个例子。但是,此操作是一次删除多个项目的首选方法。

    【讨论】:

      猜你喜欢
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多