我有一个dynamo DB表,当前我在其中存储有关每种产品的系统中发生的所有事件。主表上有一个主键,其哈希值是productid,eventtype和eventcategory的组合,而Sort Key作为创建时间。该表已创建,数据已添加到其中。
稍后,我在表上添加了一个新的GSI,其属性为Secondary Hash(这是eventcategory和eventtype(不包括productid)和CreationTime作为Sort Key的组合。添加后,我可以在以下位置查询多个产品一次。
GSI似乎工作正常,但是直到后来我才意识到返回的数据不正确
这是场景。 (我正在针对新创建的索引运行所有这些查询) 我正在查询最近30天的产品,并且查询返回312条记录,但是,当我在过去90天中运行相同的查询时,它仅返回128条记录(这是错误的,应至少等于或大于最后一条记录) 30天的记录)
我已经在我的代码中嵌入了分页逻辑,以便每次都对lastEvaluatedKey进行验证,以循环并获取下一组记录,然后在循环之后,将所有结果组合在一起。
不确定我是否缺少某些东西。
任何建议将不胜感激。
var limitPtr *int64
if limit > 0 {
limit64 := int64(limit)
limitPtr = &limit64
}
input := dynamodb.QueryInput{
ExpressionAttributeNames: map[string]*string{
"#sch": aws.String("SecondaryHash"),
"#pkr": aws.String("CreationTime"),
},
ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
":sch": {
S: aws.String(eventHash),
},
":pkr1": {
N: aws.String(strconv.FormatInt(startTime, 10)),
},
":pkr2": {
N: aws.String(strconv.FormatInt(endTime, 10)),
},
},
KeyConditionExpression: aws.String("#sch = :sch AND #pkr BETWEEN :pkr1 AND :pkr2"),
ScanIndexForward: &scanForward,
Limit: limitPtr,
TableName: aws.String(ddbTableName),
IndexName: aws.String(ddbIndexName),
}
答案 0 :(得分:2)
您达到了要评估的最大项目数量(不一定是匹配项目的数量)。限制为1 MB。
响应将包含一个 LastEvaluatedKey 参数,它是最后一项的ID。您必须使用额外的 ExclusiveStartKey 参数执行新查询。 (ExclusiveStartKey应该与LastEvaluatedKey的值相等。)
LastEvaluatedKey 为空时,您到达了表的结尾。