gpt4 book ai didi

go - 是否可以通过Dynamodb中的range/sort键进行过滤?

转载 作者:行者123 更新时间:2023-12-01 21:09:39 25 4
gpt4 key购买 nike

我有一个非常简单的“小网址”应用程序,可以在其中输入网址并返回别名。我有一个这样定义的表:

    input := &dynamodb.CreateTableInput{
AttributeDefinitions: []*dynamodb.AttributeDefinition{
{
AttributeName: aws.String("Alias"),
AttributeType: aws.String("S"),
},
{
AttributeName: aws.String("ExpiresAt"),
AttributeType: aws.String("S"),
},
},
KeySchema: []*dynamodb.KeySchemaElement{
{
AttributeName: aws.String("Alias"),
KeyType: aws.String("HASH"),
},
{
AttributeName: aws.String("ExpiresAt"),
KeyType: aws.String("RANGE"),
},
},
ProvisionedThroughput: &dynamodb.ProvisionedThroughput{
ReadCapacityUnits: aws.Int64(readCapacityUnits),
WriteCapacityUnits: aws.Int64(writeCapacityUnits),
},

TableName: aws.String(tableName),
}
主键是复合键,由别名(作为分区键)和到期(作为排序键)组成。
我的问题是我想按分区键查询,然后按排序键过滤。用例试图返回自定义(别名)域以重定向到只要它还没有过期。
这是我的查询:
    result, err := db.Query(&dynamodb.QueryInput{
TableName: aws.String(tableName),
KeyConditionExpression: aws.String("#A = :alias AND :expires_at >= #T"),
ExpressionAttributeNames: map[string]*string{
"#A": aws.String("Alias"),
"#T": aws.String(time.Now().String()),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":alias": {
S: aws.String(alias),
},
":created_at": {
S: aws.String("ExpiresAt"),
},
},
Limit: aws.Int64(1),
})
我收到此问题:
ValidationException: Query condition missed key schema element
status code: 400, request id: 7c479115-7e3d-43ae-b94e-3fdf40cb3441
现在,我了解可以设置GSI了,但是我想从根本上考虑是否可以将排序键(ExpiresAt)用于此目的。我也了解我可以按项目设置TTL,但我认为go SDK中没有看到任何可以实现此目的的东西,所以我宁愿不使用命令行。
我还要补充一点,这是一个学习练习。显然,我可以将行拉入内存并手动检查有效期,但是我想了解范围键及其用途。
基于对dynamodb book的阅读,我猜测这是我查询中某处的语义错误。
有什么想法吗?
编辑
我提出了一种查询字段的不同方法,它似乎遇到了另一个错误。
    result, err := db.Query(&dynamodb.QueryInput{
TableName: aws.String(tableName),
KeyConditionExpression: aws.String("#A = :alias AND #T >= ExpiresAt"),
ExpressionAttributeNames: map[string]*string{
"#A": aws.String("Alias"),
"#T": aws.String(time.Now().String()),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":alias": {
S: aws.String(alias),
},
},
Limit: aws.Int64(1),
})
现在返回:
ValidationException: Invalid condition in KeyConditionExpression: Multiple attribute names used in one condition
status code: 400, request id: 2df7a659-0f5c-4609-a923-397a6e05b630

最佳答案

看起来您已颠倒了KeyConditionExpression中的键和值。试试这个,

result, err := db.Query(&dynamodb.QueryInput{
TableName: aws.String(tableName),
KeyConditionExpression: aws.String("#A = :alias AND #E <= :expires_at"),
ExpressionAttributeNames: map[string]*string{
"#A": aws.String("Alias"),
"#E": aws.String("ExpiresAt"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":alias": {
S: aws.String(alias),
},
":expires_at": {
S: aws.String(time.Now().String()),
},
},
Limit: aws.Int64(1),
})

关于go - 是否可以通过Dynamodb中的range/sort键进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62804831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com