使用golang检索dynamodb中的最新记录

时间:2020-05-24 11:57:42

标签: amazon-web-services go amazon-dynamodb dynamodb-queries

我正在尝试检索插入到我的DynamoDB表中的最新记录,该表的结构如下:

  • 日期(订单密钥)
  • Id(分区键)

日期值为unix时间戳,这是json数据示例:

{
  "Date": 1590312898,
  "Id": "87a6614b-1d05-44af-ab4b-6bc0957796b3",
  "Value": 36
}

我尝试使用将Limit结果设置为1的ScanInput函数,但是我无法获得正确的顺序,所以我得到了错误的行。我尝试使用以下代码:

    filt := expression.Name("Date").NotEqual(expression.Value(nil))

    proj := expression.NamesList(expression.Name("Date"), expression.Name("Id"), expression.Name("Value"))

    expr, err := expression.NewBuilder().WithFilter(filt).WithProjection(proj).Build()

    if err != nil {
        fmt.Println("Got error building expression:")
        fmt.Println(err.Error())
    }

    // Build the query input parameters
    params := &dynamodb.ScanInput{
        Limit:                     aws.Int64(1),
        ExpressionAttributeNames:  expr.Names(),
        ExpressionAttributeValues: expr.Values(),
        FilterExpression:          expr.Filter(),
        ProjectionExpression:      expr.Projection(),
        TableName:                 aws.String(tableName),
    }

    // Make the DynamoDB Query API call
    result, err := svc.Scan(params)

也许我必须使用ScanIndexForward参数,但我不知道如何以正确的方式进行设置。

有什么建议吗?这是正确的方法吗?

预先感谢

解决方案更新:

我必须使用QueryInput而不是ScanInput函数来使用ScanInputForward,这是新代码:

      var queryInput = &dynamodb.QueryInput{
            TableName: aws.String(tableName),
            KeyConditions: map[string]*dynamodb.Condition{
                "Type": {
                    ComparisonOperator: aws.String("EQ"),
                    AttributeValueList: []*dynamodb.AttributeValue{
                        {
                            S: aws.String("SM"),
                        },
                    },
                },
            },
            ScanIndexForward: aws.Bool(false),
            Limit:            aws.Int64(1),
        }

        result, err := svc.Query(queryInput)

1 个答案:

答案 0 :(得分:1)

首先,因为您的日期是分区键,所以每当您进行扫描时,后端中的DynamoDB都会分别调用每个分区。无论返回的顺序是响应中的顺序。

如果您想使用ScanIndexForward来检索它,那么您将查看排序(或范围键)

指定索引遍历的顺序:如果为true(默认值),则以升序执行遍历;否则为false。如果为false,则以降序执行遍历。

具有相同分区键值的项目按排序键按排序顺序存储。如果排序键数据类型为数字,则结果以数字顺序存储。对于字符串类型,结果以UTF-8字节的顺序存储。对于Binary类型,DynamoDB将二进制数据的每个字节都视为无符号。

我建议您看一下如何重新整理DynamoDB表以使用Global Secondary Index,它将使用所有项目使用的分区键和日期的排序键。然后,您可以使用ScanIndexForward进行查询,并获取最大值。

否则,您将不得不执行扫描,然后对订单进行后期处理。