DynamoDB: het opgegeven sleutelelement komt niet overeen met het schema

Is er een manier om een item te krijgen, afhankelijk van een veld dat niet de hashkey is?

Voorbeeld

Mijn tafelgebruikers: id (HashKey), name, email

En ik wil de gebruiker met e-mail als ‘[email protected]’ ophalen

Hoe kan dit worden gedaan?

Ik probeer dit met boto:

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

Ik krijg de volgende foutmelding:

'The provided key element does not match the schema'

Antwoord 1, autoriteit 100%

Als u een query wilt uitvoeren op velden die niet de hash-sleutel zijn, moet u een Global Secondary Index (GSI) gebruiken. Bekijk dit AWS-berichtvoor meer details over GSI’s.

UPDATE februari 2015:Het is nu mogelijk om een GSI toe te voegen aan een bestaande tabel. Zie de Amazon Docsvoor meer details.


Helaas kun je niet toevoegen een GSI naar een bestaande DynamoDB-tabel, dus u moet een nieuwe tabel maken en uw gegevens overzetten als u hier echt een query op moet uitvoeren.

Van de Veelgestelde vragen over DynamoDB:

V: Hoe maak ik een globale secundaire index voor een DynamoDB-tabel?

Alle GSI’s die aan een tabel zijn gekoppeld, moeten worden opgegeven bij het maken van een tabel
tijd. Op dit moment is het niet mogelijk om een ​​GSI na de tafel toe te voegen
Is gemaakt. Voor gedetailleerde stappen bij het maken van een tabel en het is
Indexen, zie . U kunt een maximum van 5 Wereldwijde secundaire
indexeert
per tabel.

Als u uw gegevens niet wilt poort, kunt u overwegen om een ​​tweede dynamodb-tabel te maken met de e-mail als een hash-sleutel en de hash van het bovenliggende record om te gebruiken als een opzoeking in uw hoofdgegevenstabel, maar als u Kan zich voorstellen dat dit niet echt een optimale oplossing is en het wordt geleverd met zijn eigen hoofdpijn van het synchroniseren met uw hoofdtafel.


Antwoord 2, Autoriteit 216%

Het volgende is van toepassing op het Node.js AWS SDK in de AWS Lambda-omgeving:

Dit was een ruige voor mij. Ik liep dit probleem tegen bij het proberen de getitem-methode te gebruiken. Ongeacht wat ik heb geprobeerd, zou ik deze fout blijven ontvangen. Ik heb eindelijk een oplossing gevonden op het AWS-forum: https://forums.Aws.Amazon .com / thread.jspa? Draad = 208820

Ondraaglijkte, de schijnbare oplossing conflicteert met alle AWS-documentatie die ik kan vinden.

Hier is de code die voor mij werkte:

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

Antwoord 3, Autoriteit 47%

Ik heb ook deze foutmelding toen ik een touwtje verzendt in plaats van een geheel getal.

Natuurlijk was dit toen ik aan de database aan het schrijven was, in plaats van lezen van.


Antwoord 4, Autoriteit 11%

Ik heb deze fout in Java omdat ik de @DynamoDBHashKeyannotatie voor een bereiksleutel had gebruikt. Ik moest de @DynamoDBRangeKeyannotatie voor mijn object-ID in plaats daarvan gebruiken.


Antwoord 5, Autoriteit 5%

Ik heb deze fout in mijn Java-applicatie, omdat ik per ongeluk twee bereiktoetsen had geannoteerd (@DynamoDBRangeKey) in mijn DAO-klasse, wanneer er maar één zou moeten zijn. Ik heb de annotatie van de nieuwe toevoeging gewijzigd naar @ DynamoDBAttribute, en dat heeft het opgelost.


Antwoord 6, Autoriteit 5%

Ik heb een partitiesleutel en een sorteerleutel op mijn tabel.

Ik vraag het met alleen de partitiesleutel en ik heb deze fout.

Vraag het ondervragen van de composiettoets.

Other episodes