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

Indexing 使用GSI的DynamoDB查询的结果数据集未返回正确的结果,indexing,amazon-dynamodb,Indexing,Amazon Dynamodb,我有一个dynamo DB表,我目前正在其中存储系统中发生的与每个产品相关的所有事件。主表上有一个主键,其哈希组合为productid、eventtype和eventcategory,排序键作为创建时间。创建了该表并将数据添加到其中 后来,我在表中添加了一个新的GSI,其属性是次要哈希(它只是eventcategory和eventtype(不包括productid)的组合,CreationTime作为排序键。这是为了一次查询多个产品而添加的 GSI似乎工作正常,但直到后来我才意识到返回的数据不正

我有一个dynamo DB表,我目前正在其中存储系统中发生的与每个产品相关的所有事件。主表上有一个主键,其哈希组合为productid、eventtype和eventcategory,排序键作为创建时间。创建了该表并将数据添加到其中

后来,我在表中添加了一个新的GSI,其属性是次要哈希(它只是eventcategory和eventtype(不包括productid)的组合,CreationTime作为排序键。这是为了一次查询多个产品而添加的

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 MB

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


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

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

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


LastEvaluatedKey为空时,即到达表的末尾。

通过在DynamoDB控制台中查询来验证结果。通过在DynamoDB控制台中查询来验证结果。