2017-05-02 3 views
2

Ich fange gerade an, DynamoDB zu verwenden und habe eine 'accounts' Tabelle eingerichtet.GetItem von Secondary Index mit DynamoDB

Ich habe einen sekundären Index eingerichtet, so dass ich einen API-Benutzer und Benutzerschlüssel abfragen kann. Keiner dieser Werte ist der Primärschlüssel, da beide flüchtig sind und geändert werden können.

Die Tabelle wird gebaut mit

TableName: "Accounts", 
     KeySchema: [ 
      { AttributeName: "id", KeyType: "HASH" }, 
      { AttributeName: "email", KeyType: "RANGE" } 
     ], 
     AttributeDefinitions: [ 
      { AttributeName: "id", AttributeType: "S" }, 
      { AttributeName: "email", AttributeType: "S" } 
     ] 

und der Index ist

TableName: 'Accounts', 
      AttributeDefinitions: [ 
       {AttributeName: 'name', AttributeType: 'S'}, 
       {AttributeName: 'apiKey', AttributeType: 'S'} 
      ], 
      GlobalSecondaryIndexUpdates: [ 
       { 
        Create: { 
         IndexName: "ApiAccounts", 
         ProvisionedThroughput: { 
          ReadCapacityUnits: 1, WriteCapacityUnits: 1 
         }, 
         KeySchema: [ 
          {AttributeName: 'name', KeyType: "HASH"}, 
          {AttributeName: 'apiKey', KeyType: "STRING"} 
         ], 
         Projection: { 
          ProjectionType: "KEYS_ONLY" 
         }, 

ich jetzt versuche, eine Nutzung durch die Abfrage des ApiAccounts Index-Konto zu erhalten.

Ich versuche

dynamoClient.get({ 
      TableName: 'Accounts', 
      IndexName: 'ApiAccounts', 
      Key: { 
       name: nameKeyArray[0], 
       apiKey: nameKeyArray[1] 
      }, callback) 

Aber ich bin immer einen Fehler One of the required keys was not given a value, die mir, dass ich nicht auf einem Index a ‚bekommen‘ kann zu glauben, führt zu tun? Oder ich verweise den Index nicht richtig. Kann jemand für mich klären?

Name und API-Schlüssel sind einzigartig, so dass ich denke, ich mag eine Abfrage vermeiden oder scannen, wenn möglich

Antwort

6

ich seine denke nicht so klar von den offiziellen Dokumenten, aber Sie können Scan oder Query auf einem GSI Index durchführen, aber nicht GetItem.

Für jeden Datensatz/Element in einem Table müssen sie eindeutige HASH und RANGE Schlüssel haben.

heißt

// assume dummy api putItem(id, email, name, apiKey) 
account.putItem("1", "[email protected]", "john", "key1") // OK 
account.putItem("1", "[email protected]", "john", "key1") // NOT OK, id and email are table HASH and RANGE keys, must be unique 

Aber für Index ‚es, Hash und Range Tasten sind nicht eindeutig, so können sie Elemente dupliziert Datensätze/haben.

d.h.

// assume dummy api putItem(id, email, name, apiKey) 
account.putItem("1", "[email protected]", "john", "key1") // OK 
account.putItem("1", "[email protected]", "john", "key1") // OK 

d.h.

// assume dummy api putItem(id, email, name, apiKey) 
account.putItem("1", "[email protected]", "john", "key1") // OK 
account.putItem("2", "[email protected]", "john", "key1") // OK 

Java

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Index.html

Index implementiert QueryApi und ScanApi aber nicht GetItemApi.

JavaScript

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#getItem-property

GetItem tut nichtIndexName als Parameter akzeptieren.

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#query-property

Query nimmt IndexName als Parameter.

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#scan-property

Scan nimmt IndexName als Parameter.

+0

Vielen Dank für die Klärung, ich war überall http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.JavaScript.html - Ich nehme an, Abfrage wäre am besten für meinen Anwendungsfall und Leistung? – pedalpete

+1

@pedalpete Ja, beachten Sie jedoch, dass doppelte Datensätze zurückgegeben werden können, wenn Sie einen Index abfragen, da Hash- und Range-Schlüssel eines Index im Gegensatz zu einer Tabelle nicht eindeutig sind. –

Verwandte Themen