2016-05-06 1 views
0

Ich schreibe eine App mit der Menschen Informationen über bestimmte Ereignisse anfordern können. Da mehrere Benutzer Informationen über dasselbe Ereignis anfordern können, ist der Schlüssel für meine Anforderungstabelle Benutzername + Ereignis (wobei beide Zeichenfolgen sind).Wie frage ich einen sekundären Index auf DynamoDB in Java

Allerdings möchte ich im Java-Code, der diese Informationen liefert, keine Daten herunterladen, die ich nicht brauche, idealerweise würde ich nach dem Ereignis fragen (da ich die Benutzernamen von allen nicht kenne) die Leute, die die Frage stellen).

Ich dachte, wenn ich der Request-Tabelle einen sekundären Index namens "Ereignis" gab, die die Benutzer auch ausgefüllt (so der Hash-Schlüssel ("Schlüssel" genannt) ist Benutzername + Ereignis, und das Ereignisfeld ist nur die Ereigniszeichenfolge), konnte ich den Sekundärindex abfragen und alle Anfragen für dieses Ereignis erhalten.

Hier ist der Code:

Map<String, Condition> keyConditions = new HashMap(); 
keyConditions.put("event", new Condition() 
        .withComparisonOperator(EQ) 
        .withAttributeValueList(new AttributeValue().withS(event))); 
QueryRequest one = new QueryRequest() 
    .withTableName(REQ_TABLE) 
    .withIndexName("event") 
    .withKeyConditions(keyConditions); 
QueryResult queryResult = dynamoDB.query(one); 

Alles, was ich aber bekommen, ist diese Fehlermeldung: com.amazonaws.AmazonServiceException: Abfragebedingungsschlüssel Schema-Element verpasst: key

den Anruf zu withIndexName Entfernen ("Ereignis") macht keinen Unterschied.

Ich habe NoSQL vor dieser Woche nicht verwendet, was ein Teil des Problems sein könnte.

+0

können Sie auch den vollständigen Stack-Trace buchen? – rpmartz

Antwort

1

Sind Sie sicher, dass "event" der Name des Attributs ist, das und der Name des Indexes indiziert ist?

Sie verwenden sie als Attributnamen in der Abfrage:

keyConditions.put("event", new Condition() 
       .withComparisonOperator(EQ) 
       .withAttributeValueList(new AttributeValue().withS(event))); 

Und du bist es als Indexnamen:

.withIndexName("event") 

In der DynamoDB Konsole Ihres AWS Armaturenbrett, Überprüfen Sie die Indexe Registerkarte, um zu sehen, wie der Name des Indexes ist. Es ist eine Weile her, seit ich einen Index erstellt habe, aber ich glaube standardmäßig, dass AWS den Indexnamen normalerweise mit _index postfixiert.

+0

Danke für die implizierte Unterstützung; aber ich habe mich entschieden, es in dem zu tun, von dem ich vermute, dass es der richtige Weg ist: Verwenden von Ereignis als Hash-Schlüssel, aber mit der Benutzerkennung als primärer Sortierschlüssel, und es funktioniert perfekt. – user3660664

Verwandte Themen