Ruby Dynamodb:使用二级索引查询表

Ruby Dynamodb:使用二级索引查询表,ruby,amazon-web-services,amazon-dynamodb,Ruby,Amazon Web Services,Amazon Dynamodb,我正在使用gem查询一个表,该表如下所示: hk (Hashkey) | guid(Rangekey) | Timestamp (Secondary Range index) | other attributes aaaa | 50 | 2013-02-04T12:33:00Z | aaaa | 244 | 2013-04-22T04:54:00Z

我正在使用gem查询一个表,该表如下所示:

hk (Hashkey)  |  guid(Rangekey)  |  Timestamp (Secondary Range index)  |  other attributes
aaaa          |  50              |  2013-02-04T12:33:00Z               |
aaaa          |  244             |  2013-04-22T04:54:00Z               |
aaaa          |  342             |  2013-05-18T06:52:00Z               |
bbbb          |  243             |  2013-06-21T13:17:00Z               |
我想做的是获取在某个日期之后创建的所有“aaaa”行。 例:

当我运行上面的代码时,我得到以下结果:

Query condition missed key schema element guid (AWS::DynamoDB::Errors::ValidationException)
使用hashKey和RangeKey运行查询是可行的,但是当我用辅助范围索引替换RangeKey时,它无法告诉我需要RangeKey

如果然后添加范围键(这没有意义),则会出现以下错误:

Conditions can be of length 1 or 2 only (AWS::DynamoDB::Errors::ValidationException)

有人知道会发生什么吗?

您不是在查询辅助索引,而是在查询主索引(散列和范围键)。 要在DynamoDB中使用辅助索引,必须使用API的V2并在查询操作中指定索引

client = AWS::DynamoDB::Client.new(api_version: '2012-08-10') 

client.query( {   :table_name: 'table',   :index_name: "timestamp-index", :select: 'ALL_PROJECTED_ATTRIBUTES',   :key_conditions: {
    'hk' => {
      :comparison_operator: 'EQ',
     :attribute_value_list: [
        {'s' => 'aaaa'}
      ]
    },
    'timestamp' => {
     :comparison_operator: 'GE',
      :attribute_value_list: [
        {'s' => Time.now.utc.iso8601}
      ]
    }   } })
您可以使用“扫描”代替“查询”

我可以强调的是,扫描速度比查询速度慢,对于检索大量数据,不建议进行扫描

我在下一个模式中这样做了

哪里 主分区密钥id(字符串)

我希望能帮助你


注意。

AWS::DynamoDB::ClientV2
已弃用。您应该使用:
AWS::DynamoDB::Client.new(api_version:'2012-08-10')
是否可以使用多个索引查询表?此时,您只能使用一个索引查询表。SDK的v2版本使用
AWS::DynamoDB::Client.new
,而不是
AWS::DynamoDB…
请参阅本文
client = AWS::DynamoDB::Client.new(api_version: '2012-08-10') 

client.query( {   :table_name: 'table',   :index_name: "timestamp-index", :select: 'ALL_PROJECTED_ATTRIBUTES',   :key_conditions: {
    'hk' => {
      :comparison_operator: 'EQ',
     :attribute_value_list: [
        {'s' => 'aaaa'}
      ]
    },
    'timestamp' => {
     :comparison_operator: 'GE',
      :attribute_value_list: [
        {'s' => Time.now.utc.iso8601}
      ]
    }   } })
  //JavaScript EXAMPLE-1  
var params = {
        TableName : 'users',
        FilterExpression : 'isActive = :isActive',
        ExpressionAttributeValues : {':isActive' : true}
    };


        dynamoDBClient.scan(params, function(err, data){
            if(err){
                return console.error(err);
            }
            console.log(data.Items);

        });