2013-08-02 13 views
9

ich das Juwel bin mit aws-sdk-ruby eine Tabelle abzufragen, die etwa wie folgt aussieht:DynamoDB: Abfragen Tabellen mit Sekundärindex

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    | 

Was ich zu tun versuchen, alle ist get ‚AAAA‘ Zeilen, die nach erstellt wurden ein bestimmtes Datum. Ex:

AWS.config(access_key_id: 'xxx', secret_access_key: 'xxx', :dynamo_db => { :api_version => '2012-08-10' }) 
client = AWS::DynamoDB::Client.new 
client.query(
{ 
    table_name: 'table', 
    select: 'ALL_ATTRIBUTES', 
    key_conditions: { 
    'hk' => { 
     comparison_operator: 'EQ', 
     attribute_value_list: [ 
     {'s' => 'aaaa'} 
     ] 
    }, 
    'timestamp' => { 
     comparison_operator: 'GE', 
     attribute_value_list: [ 
     {'s' => Time.now.utc.iso8601} 
     ] 
    } 
    } 
}) 

Wenn ich führen Sie den Code oben i folgt erhalten:

Query condition missed key schema element guid (AWS::DynamoDB::Errors::ValidationException) 

Ausführen der Abfrage mit HashKey und RangeKey funktioniert, aber wenn ich die rangeKey mit einem sekundären Bereich Index ersetzen versagt es mir zu sagen, dass der rangeKey erforderlich ist.

Wenn ich den Bereich Taste fügen Sie dann (was keinen Sinn macht) i stattdessen die folgende Fehlermeldung erhalten:

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

Wer weiß, was passiert sein könnte?

+0

Bitte beziehen Sie sich auf diesen Beitrag http://stackoverflow.com/questions/21515765/retrieve-all-items-from-dynamodb-using-query –

Antwort

13

Der Sekundärindex wird nicht abgefragt, der Primärindex (Hash- und Bereichsschlüssel) wird abgefragt. Um einen Sekundärindex mit DynamoDB verwenden Sie V2 der API und geben Sie den Index in der Abfrageoperation

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} 
     ] 
    } } }) 
+5

"AWS :: DynamoDB :: ClientV2" ist veraltet. Sie sollten verwenden: 'AWS :: DynamoDB :: Client.new (api_version: '2012-08-10')' –

+1

Ist es möglich, eine Tabelle mit mehreren Indizes abzufragen? –

+0

Derzeit können Sie nur eine Tabelle mit einem Index abfragen. –

0

Sie können Ich kann http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property

verwenden müssen emphatize verwenden „Scan“ statt „Abfrage“, dass Scannen Sie langsamer als Abfrage, Scan ist nicht für große Menge Daten abrufen empfohlen.

Ich tat dies mit dem nächsten Schema

DB Schema Wo Primäre Partition Schlüssel-ID (String)

//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); 

     }); 

ich Ihnen helfen hoffen.

Grüße.

Verwandte Themen