2014-09-17 7 views
22

Meine Frage entsprechen ist über DynamoDBDynamoDB: Das bereitgestellten Schlüsselelement nicht das Schema

Es gibt einen Weg Punkt in Abhängigkeit von einem Feld zu erhalten, die nicht die Hashkey ist?

Beispiel

My Table Benutzer: id (HashKey) , name , email

Und ich möchte den Benutzer abzurufen, die E-Mail als '[email protected]'

Wie dies geschehen kann ??

Ich versuche, dies mit Boto:

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

ich die folgende Fehlermeldung erhalten:

'The provided key element does not match the schema' 

Antwort

11

Um auf Felder abfragen, die Sie nicht die Raute-Taste sind, brauchen eine globale Sekundärindex zu verwenden, (GSI). Werfen Sie einen Blick auf this AWS Post für weitere Details zu GSI.

UPDATE Feb 2015: Es ist jetzt möglich, eine GSI zu einer vorhandenen Tabelle hinzuzufügen. Weitere Informationen finden Sie unter Amazon Docs.

Leider you cannot add a GSI to an existing DynamoDB table so müssen Sie eine neue Tabelle erstellen und Ihre Daten portieren, wenn dies etwas ist, das Sie wirklich abfragen müssen.

Vom DynamoDB FAQ:

F: Wie erstelle ich einen globalen Sekundärindex für eine DynamoDB Tabelle?

Alle GSIs, die einer Tabelle zugeordnet sind, müssen bei der Tabellenerstellung Zeit angegeben werden. Zu diesem Zeitpunkt ist es nicht möglich, eine GSI hinzuzufügen, nachdem die Tabelle erstellt wurde. Ausführliche Anweisungen zum Erstellen einer Tabelle und ihrer Indizes finden Sie unter here. Sie können maximal 5 global secondary indexes pro Tabelle erstellen.

Wenn Sie nicht wollen, zu portieren Ihre Daten, die Sie eine zweite DynamoDB Tabelle erstellen mit der E-Mail als Hash-Schlüssel und der Hash-Wert des übergeordneten Datensatz betrachten könnten als Nachschlag in Ihre Haupt-Datentabelle zu verwenden, aber wie Sie sich vorstellen können, ist dies nicht gerade eine optimale Lösung, und es hat seine eigenen Kopfschmerzen, es mit Ihrem Master-Tisch zu synchronisieren.

+0

Dank Wolfwyrd .. eine Menge Dinge sind jetzt klar für mich. –

+2

Dies ist eine ältere Antwort, aber für den Fall, dass jemand diese Antwort findet, ist es jetzt möglich, globale Indizes für eine vorhandene Tabelle zu erstellen. Lokale Indizes müssen zum Zeitpunkt der Erstellung noch eingerichtet werden. –

4

Ich habe auch diesen Fehler, wenn ich eine Zeichenfolge anstelle einer Ganzzahl gesendet habe.

Natürlich war dies, wenn ich in die Datenbank schrieb, anstatt von zu lesen.

+0

in meinem Fall mit baopham/laravel-dynamodb Ich muss einen expliziten Typ mit (string) und (integer) machen: '$ model = ModelData :: where ('PartitionKey', (String) $ SearchPartitionKey) -> where ('SortKey', (ganze Zahl) $ SearchSortKey) -> get(); ' –

10

Das gilt für die Node.js AWS SDK in der AWS Lambda Umgebung:

Dies ist eine grobe für mich war. Ich habe dieses Problem bei der Verwendung der getItem-Methode festgestellt.Egal was ich versuchte, ich würde weiterhin diesen Fehler erhalten. Ich fand schließlich eine Lösung auf dem AWS-Forum: https://forums.aws.amazon.com/thread.jspa?threadID=208820

Unerklärlicherweise widerspricht die scheinbare Lösung mit allen AWS-Dokumentation, die ich finden kann.

Hier ist der Code, die für mich gearbeitet:

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

ich diesen Fehler in Java bekam, weil ich die @DynamoDBHashKey Anmerkung für eine RANGE-Taste benutzt hatte. Ich musste stattdessen die @DynamoDBRangeKey Annotation für die ID meines Objekts verwenden.