为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 DynamoDB Go SDK 中编写查询,其中分区键的条件相等,但一组分区值的排序键具有

如何在 DynamoDB Go SDK 中编写查询,其中分区键的条件相等,但一组分区值的排序键具有

Go
泛舟湖上清波郎朗 2022-08-15 15:39:09
我在 DynamoDB 中有一个带有复合键的表user_id(分区键)时间戳(排序键)我想检索一组项目,我有一组user_ids我想检索,但我也需要时间戳是每个user_id的最大值。例如:user_id时间戳阿特11614910613值111614902527值 221614910683值 221614881311值 231614902527值 2我想检索user_id 1 和 2 的行,以及每个用户的最大时间戳。在这种情况下,我的结果集应该是:user_id时间戳阿特11614910613值121614910683值 2我现在可以逐项执行此操作,执行以下 Key 表达式:cond := expression.KeyAnd(    expression.Key("user_id").Equal(expression.Value(userId)),    expression.Key("timestamp").LessThanEqual(expression.Value(int32(time.Now().Unix()))),    )expr, err:= expression.NewBuilder().WithKeyCondition(cond).Build()if err!=nil {    panic(err)}input := &dynamodb.QueryInput{    ExpressionAttributeNames: expr.Names(),    ExpressionAttributeValues: expr.Values(),    KeyConditionExpression: expr.KeyCondition(),    TableName: aws.String("td.notes"),    Limit: aws.Int64(1),    ScanIndexForward: aws.Bool(false),}我的问题是,我不知道如何传递user_id键的一组值,而不是单个值。我看了一下 BatchGetItem,我知道我可以做这样的事情:mapOfAttrKeys := []map[string]*dynamodb.AttributeValue{}for _, place := range userIDs {    mapOfAttrKeys = append(mapOfAttrKeys, map[string]*dynamodb.AttributeValue{        "user_id": &dynamodb.AttributeValue{            S: aws.String(place),        },        "timestamp": &dynamodb.AttributeValue{            N: aws.String(timestamp),        },    })}input := &dynamodb.BatchGetItemInput{    RequestItems: map[string]*dynamodb.KeysAndAttributes{        tableName: &dynamodb.KeysAndAttributes{            Keys: mapOfAttrKeys,        },    },}但是我不能在时间戳中放置“小于”条件。
查看完整描述

1 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

GetItem 和 BatchGetItem 需要确切的主键。

您需要为要返回的每个用户发出单独的 Query()。

返回 max 的关键是你所发现的

Limit: aws.Int64(1),
ScanIndexForward: aws.Bool(false),

你真的不应该需要这个

expression.Key("timestamp").LessThanEqual(expression.Value(int32(time.Now().Unix())))



查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信