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

我在 DynamoDB 中有一个带有复合键的表

user_id(分区键)时间戳(排序键)

我想检索一组项目,我有一组user_ids我想检索,但我也需要时间戳是每个user_id的最大值。

例如:

user_id时间戳阿特
11614910613值1
11614902527值 2
21614910683值 2
21614881311值 2
31614902527值 2

我想检索user_id 1 和 2 的行,以及每个用户的最大时间戳。在这种情况下,我的结果集应该是:

user_id时间戳阿特
11614910613值1
21614910683值 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,

        },

    },

}

但是我不能在时间戳中放置“小于”条件。


泛舟湖上清波郎朗
浏览 96回答 1
1回答

慕姐8265434

GetItem 和 BatchGetItem 需要确切的主键。您需要为要返回的每个用户发出单独的 Query()。返回 max 的关键是你所发现的Limit: aws.Int64(1), ScanIndexForward: aws.Bool(false),你真的不应该需要这个expression.Key("timestamp").LessThanEqual(expression.Value(int32(time.Now().Unix())))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go