2016-08-09 7 views
1

Ich habe eine Tabelle Threads mit ID (Nummer), last_message (Zahl) und is_valid (Zahl).DynamoDB: Sortierung und Filterung Index

Ich möchte Ergebnisse erhalten, wo is_valid = 1 und sortiert nach last_message Asc (oder desc).

Ich ID als Partition Schlüssel (Hash), Is_valid als Sortierschlüssel und dann erstellt einen globalen sekundären Index namens "lastMessageValidIndex" wobei der Partition Schlüssel is_valid und der Sortierschlüssel ist Last_message, aber es funktioniert nicht.

Irgendeine Idee?

Danke.

Antwort

0

müssen Sie lastMessageValidIndex abfragen. Abfrage für is_valid = 1 und Sie sollten Ergebnisse von last_message

+0

Ich habe versucht, IndexName auf lastMessageValidIndex festzulegen, aber die Reihenfolge nicht geändert. Hast du ein Beispiel für die Struktur und die Abfrage? – Grork

+0

Der Name des sekundären Index ist nicht wichtig. Sie müssen nur Sekundärindex abfragen. Dynamodb sortiert das Ergebnis für Sie. Wenn Sie also Ergebnisse erhalten, ist Ihre Abfrage in Ordnung, aber vielleicht ist Ihr Indexschema falsch. –

+0

Aus diesem Grund fragte ich. Mit "Ich setzte den Indexnamen" sprach ich über den Parameter der Abfrage. – Grork

0

erhalten Eines der Probleme mit NoSQL (und damit auch DynamoDB) ist, dass Sie nicht nur alles abfragen können. Sie können nur nach einem Index suchen und ein Index muss eindeutig sein (die Hash-Bereich-Kombination). Wenn zwei Zeilen mit demselben Wert last_valid und last_message vorhanden sind, wird nur einer in den GSI eingefügt.

Der Partitionsschlüssel is_valid hat nur ein paar Variablen (wahrscheinlich nur 0 und 1), was die Partitionierung (daher der Name) schadet. Wenn die db stark ausgelastet ist, treten Probleme auf (siehe auch https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.Partitions).

Wenn is_valid nicht relativ oft geändert wird, können Sie zwei Tabellen erstellen: eine mit nur gültigen und eine mit nur ungültigen Threads. Dann können Sie den Primärschlüssel in der richtigen Tabelle abfragen. Wenn is_valid umgeschaltet wird, verschieben Sie den Datensatz einfach von einer Tabelle in eine andere.

+0

Luc, danke. Hast du eine Idee? Ich habe herausgefunden, dass ich nicht scannen kann, weil ich dann ScanIndexForward nicht verwenden kann, aber ich kann nicht einmal Query verwenden, weil ich einen Wert für den Primärschlüssel angeben muss, aber ich möchte alle Ergebnisse mit einem bestimmten FilterExpression und geordnet haben. Ich möchte PHP nicht verwenden, um die Ergebnisse zu "postproduzieren", um die Reihenfolge festzulegen. – Grork

Verwandte Themen