1

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

我有一个表,主 hashKey 为“id”,ShopIndex GSI 为“shop”。两者都没有范围键。

当我使用不存在的开始键“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,它会返回第四个不同的项目。

重量级

据我所知,除了查找“id”并在尝试将其用作开始键之前确认它存在之外,没有其他方法可以检测到这一点?

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

4

1 回答 1

1

这是一个特点!

在您的表中,您有更多id相同的 s 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. 您应该注意到结果的差异。

所以,这绝对是一个功能!一个非常重要的,因为有了这些特性和范围键,您可以进行精彩的查询。我做到了!;)

于 2018-06-24T23:21:54.987 回答