webentwicklung-frage-antwort-db.com.de

DynamoDB: Das bereitgestellte Schlüsselelement stimmt nicht mit dem Schema überein

Gibt es eine Möglichkeit, ein Element abhängig von einem Feld zu erhalten, das nicht der Hash-Schlüssel ist?

Beispiel

Meine Tischbenutzer: id (HashKey), name, email

Und ich möchte den Benutzer mit der E-Mail als "[email protected]" abrufen.

Wie kann das gemacht werden?

Ich versuche das mit boto:

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

Ich erhalte folgende Fehlermeldung: 

'The provided key element does not match the schema'
26
Houssam Hsm

Für die Abfrage von Feldern, bei denen es sich nicht um den Hash-Schlüssel handelt, müssen Sie einen Global Secondary Index (GSI) verwenden. Werfen Sie einen Blick auf dieser AWS-Beitrag , um weitere Informationen zu den GSI zu erhalten. 

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

Leider Sie können keine GSI zu einer vorhandenen DynamoDB-Tabelle hinzufügen , so müssen Sie eine neue Tabelle erstellen und Ihre Daten portieren, wenn dies wirklich eine Abfrage erfordert.

Aus dem DynamoDB FAQ :

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

Alle einer Tabelle zugeordneten GSIs müssen bei der Tabellenerstellung angegeben werden Zeit. Derzeit ist es nicht möglich, eine GSI nach der Tabelle hinzuzufügen wurde erschaffen. Detaillierte Anweisungen zum Erstellen einer Tabelle und ihrer Indizes, siehe hier . Sie können maximal 5 globale sekundäre Indizes pro Tabelle ..__ erstellen. </ s>

Wenn Sie Ihre Daten nicht portieren möchten, können Sie in Betracht ziehen, eine zweite DynamoDB-Tabelle mit der E-Mail als Hash-Schlüssel und dem Hash des übergeordneten Datensatzes zu erstellen, um sie in Ihrer Hauptdatentabelle nachzuschlagen Eine optimale Lösung, und es hat seine eigenen Kopfschmerzen, wenn es mit Ihrem Master-Tisch synchron bleibt.

12
Wolfwyrd

Folgendes gilt für das Node.js AWS SDK in der AWS Lambda-Umgebung:

Dies war eine grobe Sache für mich. Beim Versuch, die getItem-Methode zu verwenden, bin ich auf dieses Problem gestoßen. Egal was ich versucht habe, ich würde diesen Fehler weiterhin erhalten. Ich habe endlich eine Lösung im AWS-Forum gefunden: https://forums.aws.Amazon.com/thread.jspa?threadID=208820

Aus unerklärlichen Gründen steht die offensichtliche Lösung in Konflikt mit der gesamten AWS-Dokumentation, die ich finden kann.

Hier ist der Code, der für mich funktioniert hat:

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)
});
18
Sean

Ich habe diese Fehlermeldung auch erhalten, als ich eine Zeichenfolge anstelle einer Ganzzahl sendete.

Natürlich schrieb ich in die Datenbank, anstatt aus der Datenbank zu lesen.

8

Ich habe diesen Fehler in meiner Java -Anwendung erhalten, weil ich versehentlich zwei Bereichstasten mit Anmerkungen versehen hatte (@DynamoDBRangeKey) in meiner DAO-Klasse, wenn es nur eine geben sollte. Ich habe die Annotation des neuen Zusatzes in @DynamoDBAttribute geändert und das hat es gelöst.

0
Josh

Ich habe diesen Fehler in Java erhalten, weil ich die Annotation @DynamoDBHashKey für einen RANGE-Schlüssel verwendet hatte. Ich musste stattdessen die Annotation @DynamoDBRangeKey für die ID meines Objekts verwenden.

0