2015-03-21 11 views
6

In Dynamodb è necessario specificare in un indice gli attributi che è possibile utilizzare per creare query.Dynamodb: query che utilizza più di due attributi

Come posso effettuare una query utilizzando più di due attributi?

Esempio utilizzando boto.

Table.create('users', 
     schema=[ 
      HashKey('id') # defaults to STRING data_type 
     ], throughput={ 
      'read': 5, 
      'write': 15, 
     }, global_indexes=[ 
      GlobalAllIndex('FirstnameTimeIndex', parts=[ 
       HashKey('first_name'), 
       RangeKey('creation_date', data_type=NUMBER), 
      ], 
      throughput={ 
       'read': 1, 
       'write': 1, 
      }), 
      GlobalAllIndex('LastnameTimeIndex', parts=[ 
       HashKey('last_name'), 
       RangeKey('creation_date', data_type=NUMBER), 
      ], 
      throughput={ 
       'read': 1, 
       'write': 1, 
      }) 
     ], 
     connection=conn) 

Come posso cercare gli utenti con nome 'John', il cognome 'Doe', e ha creato il '2015/03/21' utilizzando boto?

+0

la tua ricerca su un indice e possono utilizzare un [ 'ConditionExpression'] (http : //docs.aws.amazon.com/amazo ndynamodb/latest/developerguide/Expressions.SpecifyingConditions.html) per altri confronti di attributi. Non è chiaro per me come sia strutturata la tua tabella in questo momento. – mkobit

+0

quali informazioni extra ti servono? vuoi dire che il comando di creazione del tavolo non è abbastanza? –

risposta

6

Il processo di modellazione dei dati deve prendere in considerazione i requisiti per il recupero dei dati, in DynamoDB è possibile eseguire query solo per hash o hash + chiave di intervallo.

Se l'interrogazione con la chiave primaria non è sufficiente per le vostre esigenze, potete certamente avere chiavi alternative creando indici secondari (locali o globali).

Tuttavia, la concatenazione di più attributi può essere utilizzata in determinati scenari come chiave primaria per evitare il costo di mantenere gli indici secondari.

Se è necessario ottenere gli utenti in base a Nome, Cognome e Data di creazione, suggerirei di includere tali attributi nella chiave Hash e intervallo, quindi la creazione di indici aggiuntivi non è necessaria.

La chiave hash deve contenere un valore che può essere calcolato dall'applicazione e allo stesso tempo fornisce un accesso dati uniforme. Ad esempio, dire che si sceglie di definire le chiavi come segue:

Hash chiave (nome): first_name # last_name

key range (create): MM-GG-AAAA-HH-MM-SS-millisecondi

È sempre possibile aggiungere attributi aggiuntivi nel caso in cui quelli menzionati non siano sufficienti a rendere la chiave univoca sul tavolo.

users = Table.create('users', schema=[ 
     HashKey('name'), 
     RangeKey('created'), 
    ], throughput={ 
     'read': 5, 
     'write': 15, 
    }) 

Aggiungendo l'utente al tavolo:

with users.batch_write() as batch: 
    batch.put_item(data={ 
     'name': 'John#Doe', 
     'first_name': 'John', 
     'last_name': 'Doe', 
     'created': '03-21-2015-03-03-02-3243', 
    }) 

Il codice per trovare l'utente John Doe, creato '03 -21-2015' dovrebbe essere qualcosa di simile:

name_john_doe = users.query_2(
    name__eq='John#Doe', 
    created__beginswith='03-21-2015' 
) 

for user in name_john_doe: 
    print user['first_name'] 

Considerazioni importanti:

i. Se la query inizia a diventare troppo complicata e Hash o Range Key troppo a lungo con troppi campi concatenati, non utilizzare in alcun modo gli indici secondari. È un buon segno che solo un indice primario non è sufficiente per le tue esigenze.

ii. Ho detto che il tasto cancelletto dovrebbe fornire accesso ai dati uniforme:.

"Dynamo usa hashing coerente per partizionare il suo spazio chiave attraverso le sue repliche e per garantire una distribuzione uniforme del carico Una chiave distribuzione uniforme può aiutarci a raggiungere distribuzione uniforme del carico supponendo che la distribuzione dell'accesso delle chiavi non sia molto distorta."[DYN]

Non solo il tasto cancelletto permette di identificare in modo univoco il record, ma è anche il meccanismo per garantire la distribuzione del carico. La chiave Range (se utilizzati) aiuta a indicare i record che verranno per lo più recuperati insieme, quindi, , l'archiviazione può anche essere ottimizzato per tale bisogno

il link qui sotto ha una spiegazione completa sul tema:.

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.UniformWorkload

+1

Grazie! Abbiamo fatto esattamente questo e funzionano molto bene: D –

Problemi correlati