我理解这个查询可能效率低,因为在最坏的情况下它可能涉及全表扫描,但我需要一次只获取一个项目。
例如,我有一个包含如下值的表:
{
id: 'bc63a25e-b92b-483e-9ad3-ad6d474dfae2',
domain: 'xyz.com',
template_url: `https://s3.us-east-2.amazonaws.com/bucket/some-random-url.html`,
data_elements: {
message_link: 'http://www.google.com'
zodiac_sign: 'Scorpio'
}
}
我有一个GSI,域名为哈希键。现在我想从这个表中获取项目:
WHERE domain == 'xyz.com'
AND id not in <a list of ids>
LIMIT 1;
如何实现此类查询?我检查了文档,我看到有IN
运算符,但找不到任何NOT IN
运算符。
答案 0 :(得分:1)
我有同样的问题,我认为你不能。您需要使用密钥才能获得&#39; get&#39;方法和&#39;扫描&#39;方法。唯一的选择(我认为)是获取所有项目,然后对每个人进行字符串比较。我不认为我需要提到它会有多么昂贵。
如上所述,我不得不处理同样的问题,最后我改变了我的数据结构。开始时有点麻烦,我有两倍的关系数据库的数据条目,但它可以忽略不计,即使在微型AWS实例上查询速度也非常快。
您无法在可以在MySQL数据库上执行的NoSQL数据库上执行相同的操作,这是一个很好的例子。
答案 1 :(得分:1)
我不确定为什么你提到扫描,因为你有hashkey
的GSI。您可以将查询API与以下参数一起使用。
var idArray = ["1", "2"];
var params = {
TableName : "tablename",
IndexName : 'your_index_name',
KeyConditionExpression : 'domain = :domainVal',
FilterExpression : "NOT #id IN (:idValue)",
ExpressionAttributeNames: { "#id": "id" },
ExpressionAttributeValues : {
":domainVal" : 'xyz.com',
":idValue" : idArray
}
};
我测试了我桌上的NOT IN
。它对我来说很好。
答案 2 :(得分:0)