2014-09-17 18 views
22

La mia domanda riguarda DynamoDBDynamoDB: L'elemento chiave in dotazione non corrisponde allo schema

C'è un modo per ottenere voce in base su un campo che non è il HashKey?

Esempio

miei utenti Tabella: id (HashKey) , name , email

E voglio recuperare l'utente debba email '[email protected]'

Come questo può essere fatto ??

provo questo con boto:

user = users.get_item(email='[email protected]')

ottengo il seguente errore:

'The provided key element does not match the schema' 

risposta

11

Per eseguire query su campi che non sono il tasto cancelletto è necessario utilizzare un indice globale secondaria (GSI). Dai uno sguardo allo this AWS Post per maggiori dettagli su GSI.

AGGIORNAMENTO Febbraio 2015: È ora possibile aggiungere un GSI a una tabella esistente. Vedere lo Amazon Docs per ulteriori dettagli.

Purtroppo you cannot add a GSI to an existing DynamoDB table quindi dovrai creare una nuova tabella e portare i tuoi dati se questo è qualcosa su cui hai davvero bisogno di eseguire una query.

Dal DynamoDB FAQ:

D: Come faccio a creare un indice secondario globale per un tavolo DynamoDB?

Tutti i GSI associati a una tabella devono essere specificati al momento della creazione della tabella . Al momento non è possibile aggiungere un GSI dopo che è stata creata la tabella . Per i passaggi dettagliati sulla creazione di una tabella e gli indici , vedere here. È possibile creare un massimo di 5 global secondary indexes per tabella.

Se non si desidera porta i dati si potrebbe prendere in considerazione la creazione di una seconda tabella DynamoDB con l'e-mail come una chiave hash e l'hash del record padre da utilizzare come una ricerca nella vostra tabella di dati principale ma come puoi immaginare, questa non è esattamente una soluzione ottimale e viene fornito con i suoi mal di testa di tenerlo sincronizzato con il tuo tavolo principale.

+0

Grazie Wolfwyrd .. un sacco di cose sono chiare per me ora. –

+2

Questa è una risposta più vecchia, ma nel caso qualcuno trovi questa risposta, è ora possibile creare indici globali su una tabella esistente. Gli indici locali devono essere ancora impostati al momento della creazione. –

4

Ho anche ricevuto questo errore quando stavo inviando una stringa invece di un numero intero.

Naturalmente, questo era quando stavo scrivendo nel database, piuttosto che leggere da.

+0

nel mio caso usando baopham/laravel-dynamodb Devo fare un tipo esplicito usando (stringa) e (numero intero): '$ model = ModelData :: where ('PartitionKey', (stringa) $ SearchPartitionKey) -> dove ('SortKey', (intero) $ SearchSortKey) -> get(); ' –

10

Quanto segue si applica al Node.JS AWS SDK nell'ambiente AWS Lambda:

Questo è stato un anno di massima per me. Mi sono imbattuto in questo problema durante il tentativo di utilizzare il metodo getItem.Non importa cosa ho provato, continuerei a ricevere questo errore. Ho finalmente trovato una soluzione sul forum AWS: https://forums.aws.amazon.com/thread.jspa?threadID=208820

Inspiegabilmente, la soluzione apparente è in conflitto con tutta la documentazione AWS che riesco a trovare.

Ecco il codice che ha funzionato per me:

var doc = require('dynamodb-doc'); 
var dynamo = new doc.DynamoDB(); 

var params = { } 
params.TableName = "ExampleTable"; 
var key = { "ExampleHashKey": "1" }; 
params.Key = key; 

dynamo.getItem(params, function(err, data) { 
    if (err) 
     console.log(err); 
    else 
     console.log(data) 
}); 
0

ho ottenuto questo errore in Java perché avevo usato il @DynamoDBHashKey annotazioni per un tasto RANGE. Ho dovuto usare l'annotazione @DynamoDBRangeKey per l'id del mio oggetto.

Problemi correlati