2012-11-27 16 views
5

Sono abbastanza nuovo per Amazon AWS e la sua API per Java, quindi non sono esattamente sicuro quale sia il metodo più efficiente per quello che sono provare a fare sarebbe. Fondamentalmente, sto provando a configurare un database che memorizzerà l'ID di un progetto, il suo stato, così come il bucket e la posizione quando caricati su un bucket S3 da un utente. Quello che sto avendo problemi è ottenere un elenco di tutti gli ID di progetto che hanno uno stato di "pronto" sotto l'attributo status. Tutti i progetti di stato "pronto" devono avere i loro numeri di identificazione caricati su un array o un arraylist per riferimenti futuri. Qualche consiglio?Amazon DynamoDB per ottenere articoli con valore attributo di ... (Java API)

risposta

4

Il modo per farlo è utilizzare l'API di scansione. Tuttavia, questo significa che la dinamo dovrà esaminare ogni elemento della tabella e verificare se l'attributo "stato" è uguale a "pronto". Il costo di questa operazione sarà grande e ti addebiterà per la lettura di ogni articolo nel tuo tavolo.

Il codice dovrebbe essere simile a questo:

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

C'è un modo per fare questo meglio, anche se richiede denormalizing tuoi dati. Prova a mantenere una seconda tabella con una chiave hash di "stato" e una chiave di intervallo di "ID progetto". Questo è in aggiunta al tuo tavolo esistente. Ciò consentirebbe di utilizzare l'API Query (cugino molto più economico della scansione) e chiedergli tutti gli elementi con una chiave hash di "pronto". Questo ti darà una lista degli ID di progetto che ti servono, e potrai quindi ottenerli dalla tabella ID del progetto che hai già.

Il codice per questo sarebbe simile:

QueryRequest queryRequest = new QueryRequest() 
    .withTableName("ProductByStatus") 
    .withHashKeyValue(new AttributeValue().withS("ready")); 

QueryResult result = client.query(queryRequest); 

L'aspetto negativo di questo approccio è che bisogna aggiornare due tabelle ogni volta che si aggiorna il campo di stato, e si deve fare in modo che li si mantiene in sync. Dynamo non offre la transazione, quindi devi essere pronto per il caso in cui l'aggiornamento alla tabella del progetto principale ha esito positivo, ma la tabella di stato secondaria non lo fa. O vice versa.

Per ulteriori riferimenti: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/QueryAndScan.html

+0

Questo appare come farà il trucco. Il processo è già gestito in un flusso di lavoro di tipo waterfall, quindi se una qualsiasi parte di esso fallisce prima dell'ultimo passaggio (che aggiornerebbe questo stato) termina in anticipo, quindi lo stato verrà aggiornato solo se tutto il resto avrà esito positivo. Grazie per l'aiuto! – DGolberg

+0

Un anno e mezzo dopo, ottengo un upvote per questo, ma mi sento in colpa: DynamoDB ha rilasciato indici secondari, creati per questo scopo senza la complessità di dover gestire un altro tavolo. Dai un'occhiata! –

+0

Lol, l'ho notato anch'io e stavo anche pensando di aggiornare il post. Ma sì, l'indice secondario è bello ... anche se ci sono ancora casi in cui la tua risposta originale si applica ancora. Chiunque sia interessato a questo post, si assicuri di leggere la documentazione al momento di decidere se sono i migliori per lei, in particolare la sezione "Usa gli indici con parsimonia" della documentazione, se ti stai chiedendo perché (documento disponibile qui: http://docs.aws .amazon.com/amazondynamodb/ultima/developerguide/GuidelinesForLSI.html). – DGolberg

Problemi correlati