2012-01-23 11 views
14

domanda Amazon AWS DynamoDB.query DynamoDB con operatori di confronto

Esistono esempi di utilizzo di RangeKeyCondition e ComparisonOperators come CONTAINS, IN, BETWEEN. Sto cercando di recuperare i dati in base a un RangeKey composto (concatenato e delimitato). Ad esempio, data + autore + parole chiave per la tabella dei libri. Supponiamo che in questo caso HashValue sia "libro" (può essere libro, dvd, video, link ecc.). Vorrei selezionare tutti i libri che contengono la parola chiave "magia" o tutti i libri dell'autore "John Doe". Un esempio di record/elemento sarà simile a questo:

Hash ------ Intervallo ---------------------------- ------------------------------------- attribute1 ... attributex

book --- --- 2012-1-20 ~ john doe ~ avventura ~ magic ~ travel ---------------- descrizione ... alcune cose

Nel tentativo di utilizzare l'operatore condizionale IN o CONTAINS, ottengo il seguente errore: oggetto (CFSimpleXML) 20 public '__type' => stringa 'com.amazon.coral.validate # ValidationException' (lunghezza = 45) public 'message' => stringa 'Tentativo il vincolo condizionale non è un'operazione indicizzabile '

Impossibile trovare esempi utilizzando questi ComparisonOperators. Qualsiasi aiuto sarebbe molto apprezzato.

Grazie.

risposta

34

E 'importante rendersi conto della differenza tra i due API di ricerca Query and Scan in Amazon DynamoDB:

  • Query

    A query operation searches only primary key attribute values and supports a subset of comparison operators on key attribute values to refine the search process. A query returns all of the item data for the matching primary keys (all of each item's attributes) up to 1MB of data per query operation. [...]

    [..] For information about each comparison operator available for query operations, see the API entry for Query .

    [emphasis mine]

  • Scan

    A scan operation scans the entire table. You can specify filters to apply to the results to refine the values returned to you, after the complete scan. Amazon DynamoDB puts a 1MB limit on the scan (the limit applies before the results are filtered). [...]

    [...] For information about each comparison operator available for scan operations, see the API entry for Scan .

Ora, il su sottoinsieme per la RangeKeyCondition: ComparisonOperator dell'API di query escludeCONTAINS e IN, che sono entrambi disponibili nell'API di scansione ; solo l'operatore di confronto BETWEEN è disponibile all'interno di entrambe le API.

Questa limitazione deriva probabilmente da considerazioni sulle prestazioni, ovvero il supporto di CONTAINS probabilmente eliminerebbe l'obiettivo di DynamoDB di prestazioni/velocità prevedibili.

Come al solito con le soluzioni NoSQL, è necessario tenere conto di tali limitazioni adattando di conseguenza il progetto dell'applicazione, ovvero indirizzando sia il proprio caso d'uso sia l'architettura NoSQL specifica a cui si mira.

Buona fortuna!

+8

Grazie Stefen. Hai assolutamente ragione. Sfortunatamente c'è stato un bug nella documentazione degli sviluppatori AWS che mostra che questi operatori sono disponibili anche per Query. – user573306

Problemi correlati