我正在尝试检索插入到我的DynamoDB表中的最新记录,该表的结构如下:
日期值为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)
答案 0 :(得分:1)
首先,因为您的日期是分区键,所以每当您进行扫描时,后端中的DynamoDB都会分别调用每个分区。无论返回的顺序是响应中的顺序。
如果您想使用ScanIndexForward来检索它,那么您将查看排序(或范围键)
指定索引遍历的顺序:如果为true(默认值),则以升序执行遍历;否则为false。如果为false,则以降序执行遍历。
具有相同分区键值的项目按排序键按排序顺序存储。如果排序键数据类型为数字,则结果以数字顺序存储。对于字符串类型,结果以UTF-8字节的顺序存储。对于Binary类型,DynamoDB将二进制数据的每个字节都视为无符号。
我建议您看一下如何重新整理DynamoDB表以使用Global Secondary Index,它将使用所有项目使用的分区键和日期的排序键。然后,您可以使用ScanIndexForward进行查询,并获取最大值。
否则,您将不得不执行扫描,然后对订单进行后期处理。