2013-08-02 12 views
9

Używam gem aws-sdk-ruby kwerendy tabelę, która wygląda mniej więcej tak:Dynamodb: Zapytania tabele z indeksem wtórnym

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    | 

Co staram się zrobić, to wszystkie „aaaa” wiersze, które zostały utworzone po pewna data. 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} 
     ] 
    } 
    } 
}) 

kiedy uruchomić powyższy kod i uzyskać w ten sposób:

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

Uruchamianie kwerendy z hashKey i RangeKey działa, ale kiedy wymienić rangeKey z wtórnym indeksu zakres to nie mówi mi, że rangeKey jest wymagany.

Jeśli następnie dodać klucz range (co sprawia, że ​​nie ma sensu) pojawia się następujący błąd zamiast:

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

ktoś wie co może się dziać?

+0

Proszę odnieść się do tego postu http://stackoverflow.com/questions/21515765/retrieve-all-items-from-dynamodb-using-query –

Odpowiedz

13

Nie przesyłasz zapytania do indeksu dodatkowego, pytasz o główny indeks (skrót i klucz zakresu). Aby użyć indeksu wtórnego z DynamoDB należy użyć V2 API i określić wskaźnik w operacji zapytań

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' jest przestarzałe. Powinieneś użyć: 'AWS :: DynamoDB :: Client.new (api_version: '2012-08-10')' –

+1

Czy możliwe jest zapytanie do tabeli za pomocą wielu indeksów? –

+0

W tej chwili można tylko kwerendy tabeli przy użyciu jednego indeksu. –

0

Można użyć „skanowanie” zamiast „zapytania” http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#scan-property

mogę emphatize że skanuj wolniej niż zapytanie, skanowanie nie jest zalecane do pobierania dużych ilości danych.

Zrobiłem to z kolejnym schemacie

DB Schema Gdzie Partycja podstawowa id klucz (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); 

     }); 

mam nadzieję pomóc.

Pozdrawiam.