Ich bin ziemlich neu in Amazon AWS und seine API für Java, so bin ich nicht genau sicher, welche die effizienteste Methode für was ich bin versuchen zu tun wäre. Im Grunde versuche ich eine Datenbank einzurichten, die die ID eines Projekts, seinen Status sowie den Bucket und den Speicherort speichert, wenn sie von einem Benutzer in einen S3-Bucket hochgeladen werden. Woran ich Probleme habe, ist eine Liste aller Projekt-IDs zu erhalten, die unter dem status-Attribut den Status "ready" haben. Alle Projekte, die den Status "ready" haben, müssen ihre ID-Nummern in ein Array oder eine Arraylist zur späteren Referenz geladen haben. Irgendwelche Empfehlungen?Amazon DynamoDB zum Abrufen von Elementen mit Attributwert von ... (Java-API)
Antwort
Der Weg dies zu tun ist, die Scan-API zu verwenden. Dies bedeutet jedoch, dass der Dynamo jedes Element in Ihrer Tabelle betrachten muss und prüfen muss, ob sein Attribut "status" gleich "ready" ist. Die Kosten für diesen Vorgang sind hoch und berechnen Ihnen das Lesen jedes Artikels in Ihrer Tabelle.
Der Code würde wie folgt aussehen:
Condition scanFilterCondition = new Condition()
.withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(new AttributeValue().withS("ready"));
Map<String, Condition> conditions = new HashMap<String, Condition>();
conditions.put("status", scanFilterCondition);
ScanRequest scanRequest = new ScanRequest()
.withTableName("MasterProductTable")
.withScanFilter(conditions);
ScanResult result = client.scan(scanRequest);
Es gibt eine Möglichkeit, dies besser zu machen, obwohl sie Ihre Daten erfordert Denormalisierung. Versuchen Sie, eine zweite Tabelle mit einem Hash-Schlüssel "Status" und einem Bereichsschlüssel "Projekt-ID" zu führen. Dies ist zusätzlich zu Ihrer vorhandenen Tabelle. Dies würde es Ihnen ermöglichen, die Query-API (die viel billigere Version von canin) zu verwenden und sie nach allen Elementen mit einem Hash-Schlüssel "ready" zu fragen. Dadurch erhalten Sie eine Liste der benötigten Projekt-IDs, die Sie dann aus der bereits vorhandenen Projekt-ID-Tabelle abrufen können.
Der Code für das wäre in etwa so aussehen:
QueryRequest queryRequest = new QueryRequest()
.withTableName("ProductByStatus")
.withHashKeyValue(new AttributeValue().withS("ready"));
QueryResult result = client.query(queryRequest);
Der Nachteil dieses Ansatzes ist, dass Sie zwei Tabellen aktualisieren, wann immer Sie das Statusfeld aktualisieren, und Sie müssen sicherstellen, dass Sie halten sie in synchronisieren Da Dynamo keine Transaktionalität bietet, müssen Sie für den Fall bereit sein, in dem die Aktualisierung der Hauptprojekttabelle erfolgreich ist, die sekundäre Statustabelle jedoch nicht. Oder umgekehrt.
Weitere Referenz: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html
Das sieht aus wie es den Trick tun. Der Prozess wird bereits in einem Workflow vom Typ "Wasserfall" behandelt. Wenn ein Teil davon vor dem letzten Schritt fehlschlägt (der diesen Status aktualisieren würde), wird er früh beendet, sodass der Status nur dann aktualisiert wird, wenn alles andere erfolgreich ist. Danke für die Hilfe! – DGolberg
Eineinhalb Jahre später bekomme ich dafür eine positive Bewertung, aber ich fühle mich schuldig: DynamoDB hat sekundäre Indizes veröffentlicht, die zu diesem Zweck erstellt wurden, ohne dass Sie eine andere Tabelle verwalten müssen. Schau sie dir an! –
Lol, das habe ich auch bemerkt und erwog auch, den Beitrag zu aktualisieren. Aber ja, sekundärer Index ist nett ... obwohl es immer noch Fälle gibt, in denen deine ursprüngliche Antwort noch immer zutrifft. Wenn Sie sich für diesen Beitrag interessieren, sollten Sie die Dokumentation lesen, wenn Sie entscheiden, ob sie für Sie am besten geeignet ist, insbesondere den Abschnitt "Indizes sparsam verwenden" in der Dokumentation, wenn Sie sich fragen, warum (Dokumentation hier verfügbar: http://docs.aws .amazon.com/amazondynamodb/neuste/entwicklerguide/GuidelinesForLSI.html). – DGolberg