Как удалить несколько элементов из таблицы DynamoDB в Go

У меня есть таблица DynamoDB, которая содержит такие элементы:

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

Мне нужно удалить все AuthEntry элементы старше 5 минут (CreatedOn ‹сейчас - 5 минут) и без токена (Token пусто). Мне ясно, как удалять по одному элементу за раз ... но мне интересно, как удалить несколько элементов за один раз. Большое спасибо.


person j3d    schedule 10.03.2021    source источник
comment
может быть дубликат stackoverflow.com/questions/62022594/   -  person reda la    schedule 10.03.2021
comment
Нет, с aws-sdk-go-v2 это не работает ...   -  person j3d    schedule 10.03.2021
comment
можешь объяснить дальше? Насколько я знаю, aws-sdk-go-v2 в основном увеличивает модульность ... У Сета хороший и похожий ответ.   -  person reda la    schedule 10.03.2021


Ответы (2)


Когда дело доходит до удаления, у вас есть несколько вариантов.

deleteItem - удаляет отдельный элемент в таблице по первичному ключу. .

batchWriteItem - операция BatchWriteItem помещает или удаляет несколько элементов в один или более таблиц. Один вызов BatchWriteItem может записать до 16 МБ данных, которые могут содержать до 25 запросов на размещение или удаление.

TimeToLive - вы можете использовать DynamoDBs Time To Live (TTL) возможность удаления ненужных элементов. Имейте в виду, что TTL помечает ваши элементы только для удаления, а фактическое удаление может занять до 48 часов.

Я не уверен, какие элементы в вашей таблице являются частью первичного ключа, поэтому мне сложно привести пример. Однако эта операция является предпочтительным методом для одновременного удаления нескольких элементов.

person Seth Geoghegan    schedule 10.03.2021

Я искал пример, подобный приведенному ниже ... и надеюсь, что он поможет другим новичкам вроде меня. Например, сначала я использую 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
}
person j3d    schedule 10.03.2021