使用GSI的DynamoDB查询的结果数据集未返回正确的结果

时间:2019-03-26 12:39:33

标签: indexing amazon-dynamodb

我有一个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),
    }

1 个答案:

答案 0 :(得分:2)

您达到了要评估的最大项目数量(不一定是匹配项目的数量)。限制为1 MB。

响应将包含一个 LastEvaluatedKey 参数,它是最后一项的ID。您必须使用额外的 ExclusiveStartKey 参数执行新查询。 (ExclusiveStartKey应该与LastEvaluatedKey的值相等。)

LastEvaluatedKey 为空时,您到达了表的结尾。