当使用不存在的开始键查询动态GSI时,结果很奇怪。错误或功能?

时间:2018-06-21 18:56:42

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

我正在使用不存在的开始键查询全局二级索引,并且看到一些奇怪的结果。这是ddb错误还是(un?)记录的行为?有解决方法吗?

我有一个主哈希键为“ id”且ShopIndex GSI为“ shop”的表。两者都没有rangeKeys。

当我使用不存在的开始键“ id”进行查询时,由于没有结果返回到 之后,我希望返回一个带有正确的最后求值键的空响应。无效的开始密钥。

但是,我看到的是看似随机的结果被返回。

代码示例:

此代码段从索引返回一项。不是第一个结果。不是最后一个。

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB();
dynamodb.query({
    TableName: 'products',
    IndexName: 'ShopIndex',
    Limit: 1,
    ExpressionAttributeValues: {
        ':shop': { S: 'shop_KgHqp62taEV' }
    },
    KeyConditionExpression: 'shop = :shop',
    ExclusiveStartKey: {
        id: { S: 'doesnotexist' },
        shop: { S: 'shop_KgHqp62taEV' },
    },
}, (err, result) => {
    if (err) throw err;
    console.log('result', JSON.stringify(result, null, 2));
});

如果我完全删除开始键,它将返回另一个项目。

如果我将其重新添加并设置ScanIndexForward:false,它将返回第三个不同的项。

如果我删除开始键并设置ScanIndexForward:false,它将返回第四个不同的项目。

Wtf。

据我所知,除了尝试查找“ id”并确认其存在之前,没有其他方法可以检测到它。

我是否在文档中错过了这个,还是我还需要解决的另一个不包括aws地雷的电池?

1 个答案:

答案 0 :(得分:1)

这是一个功能!

在您的表中,相同的id有更多shop个。

想象一下下面的例子:

id shop 41 A 22 A 93 A 34 A

项目按照以下顺序存储在存储器中:41, 22, 93, 34

如果您要求提供一个没有任何ExclusiveStartKey的 项,则会得到41(第一次扫描)。

当您说开始密钥(即上次评估的密钥)是93时,您将得到下一个密钥:34

当您说开始键是93,但是ScanIndexForward: false时,您将向后看,将得到22

为了更好地理解,请在不使用Limit: 1的情况下运行查询。您应该注意到结果的差异。

因此,它绝对是一项功能!这是非常重要的一项,因为有了这些功能和范围键,您可以进行出色的查询。我做到了! ;)