2015-06-02 7 views
8

Nuovo su DynamoDB e è necessario eseguire la query sopra, ma non si sa come. Ecco cosa sto provando attualmente, e sto ricevendo l'errore qui sotto.DynamoDB Javascript - Domanda per chiave primaria e serie di chiavi di intervallo?

Btw, io sto usando questa libreria javascript w/DynamoDB: https://github.com/awslabs/dynamodb-document-js-sdk

var ids = ['12313','12312313','12312313']; 
var params = { 
     TableName: 'apps', 
     IndexName: 'state-app_id-index', 
     KeyConditions: [ 
      DynamoDB.Condition("state", "EQ", "active"), 
      DynamoDB.Condition("id", "IN", ids) 
     ] 
    }; 

    DynamoDB.query(params, function(error, response) {}); 

L'errore che sto ottenendo è la seguente:

ValidationException: Uno o più valori di parametro non sono validi: ComparisonOperator IN non è valido per il tipo L AttributeValue

risposta

3

KeyConditions non supporta loOperatore. La documentazione per KeyCondition dice quello che fa gli operatori di supporto:

Per KeyConditions, solo i seguenti operatori di confronto sono supportati:

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN

L'operatore EQ funziona solo per un singolo valore così:

  • EQ: Equal.

    AttributeValueList può contenere un solo AttributeValue di tipo String, Number, o Binary (non un tipo di set). Se un elemento contiene un elemento AttributeValue di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde. Ad esempio, {"S":"6"} non equivale a {"N":"6"}. Inoltre, {"N":"6"} non equivale a {"NS":["6", "2", "1"]}.

Le restrizioni sono sostanzialmente uguale per KeyConditionExpression, che è il più recente, raccomandato modo per il filtraggio sui tasti. Ecco un frammento dalla documentazione (sottolineatura mia):

La condizione deve eseguire un test di uguaglianza su un singolo tasto cancelletto valore. La condizione può anche eseguire uno dei numerosi test di confronto su un valore di chiave a intervallo singolo. Query possono utilizzare KeyConditionExpression a recuperare un elemento con un determinato hash e campo di valori chiave, o più elementi che hanno lo stesso valore chiave hash, ma diversa gamma valori chiave

Nel tuo caso, si potrebbe compilare lo FilterExpression in modo simile a quello descritto in this answer.

+1

Sto cercando la stessa cosa ma come per il tuo link 'Un'espressione FilterExpression non consente attributi chiave. Non è possibile definire un'espressione di filtro basata su una chiave di partizione o una chiave di ordinamento. Quindi torna al punto di partenza. –

1

L'unico modo per utilizzare l'istruzione IN è utilizzare una condizione di filtro. Tuttavia, l'espressione filtro può contenere solo attributi chiave non primari. Quindi la query che si desidera ottenere è NON possibile con chiavi primarie. Qualcosa di simile

var params = { 
    TableName: 'apps', 
    ... 
    FilterExpression: "#id IN (:one,:two)",: 
... 

è possibile solo con chiave non primaria attributi

La soluzione è possibile applicare sta usando il batch ottenere item Quindi invece di emettere una query emettere multipli in una sola chiamata e ogni condizione deve contenere un valore dall'array ids.

Quando si tratta di elementi in batch, prendere nota delle unità di capacità di lettura (batch get item in node.js).

Problemi correlati