DynamoDB:如何获取属性值不在给定值列表中的单个项目?

时间:2017-07-25 20:05:52

标签: amazon-dynamodb

我理解这个查询可能效率低,因为在最坏的情况下它可能涉及全表扫描,但我需要一次只获取一个项目。

例如,我有一个包含如下值的表:

{
  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运算符。

3 个答案:

答案 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)

如果使用EMR Hive或Redshift,则可以在DynamoDB上运行SQL查询。在这种情况下,您可以使用任何SQL运算符来查询数据。

当然,这不适用于交互式查询,仅适用于不经常执行的某些分析查询。

Here是如何将DynamoDB与Redshift一起使用。

Here是如何将DynamoDB与EMR Hive一起使用。