我正在使用不存在的开始键查询全局二级索引,并且看到一些奇怪的结果。这是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地雷的电池?
答案 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
的情况下运行查询。您应该注意到结果的差异。
因此,它绝对是一项功能!这是非常重要的一项,因为有了这些功能和范围键,您可以进行出色的查询。我做到了! ;)