2015-11-21 8 views
10

Sto creando un tavolo e GSI a dinamo, utilizzando questi parametri, come per la documentazione:Interrogazione di un Global Index secondaria in DynamoDB locale

configId è la chiave primaria della tabella, e sto usando l'ID publisher come . la chiave primaria per il GSI (ho rimosso alcuni parametri di configurazione necessari per brevità)

var params = { 
    TableName: 'Configs', 
    KeySchema: [ 
     { 
      AttributeName: 'configId', 
      KeyType: 'HASH', 
     } 
    ], 
    AttributeDefinitions: [ 
     { 
      AttributeName: 'configId', 
      AttributeType: 'S', 
     }, 
     { 
      AttributeName: 'publisherId', 
      AttributeType: 'S', 
     } 
    ], 
    GlobalSecondaryIndexes: [ 
     { 
      IndexName: 'publisher_index', 
      KeySchema: [ 
       { 
        AttributeName: 'publisherId', 
        KeyType: 'HASH', 
       } 
      ] 
     } 
    ] 
}; 

sto interrogazione di questa tabella di utilizzare questo:

{ TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: 'publisherId = :pub_id', 
    ExpressionAttributeValues: { ':pub_id': { S: '700' } } } 

ma io continua a ricevere l'errore: "ValidationException: uno o più valori di parametro non erano validi: il tipo di parametro Condizione non corrisponde al tipo di schema"

Nei documenti specifica che il KeyType principale può essere HASH o RANGE e che si imposta the attributeType nel campo attributeDefinitions. Sto inviando il publisherId come String, non so cosa mi manca qui.

Il problema sta nel modo in cui sto creando la tabella o il modo in cui sto eseguendo una query? Grazie

+0

Vorrei creare una chiamata a Tema descrittivo su "Configs" per verificare che l'indice secondario sia stato creato come previsto. –

risposta

33

cercare di cambiare questo

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
} 

in questo

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': '700'} 
} 

Da { ':pub_id': { S: '700' } }-{ ':pub_id': '700'}.

Ho avuto lo stesso problema e ho trascorso 2 giorni per questo. La documentazione ufficiale in fuorviante.

+0

Siamo spiacenti, ho provato questo ma non funziona per me. Quando non fornisco qualcosa con il tipo di dati, come in: {': pub_id': {S: '700'}}, ottengo un errore di convalida. Sei sicuro di non parlare di ExpressionAttributesNames invece di ExpressionAttributesValues? –

+0

La parola chiave corretta è 'ExpressionAttributeValues' e non AttributeS. Sei sicuro che la tua ValidationException non sia punita con questo piccolo errore? Nel mio caso non ho usato il parametro 'ExpressionAttributeNames' e questo ha funzionato. – gior91

+0

@ gior91 Cool! Questo mi ha davvero aiutato. Grazie! – ckuijjer

0

provare a sostituire il vostro JSON query con questo:

{ 
    TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: '#publisherId = :pub_id', 
    ExpressionAttributeNames: { '#publisherId': 'publisherId' }, 
    ExpressionAttributeValues: { ':pub_id': { 'S': '700' } } 
} 
2

scopre che dipende dal fatto che si utilizzi o AWS.DynamoDBAWS.DynamoDB.DocumentClient.

verificare la differenza nella documentazione: AWS.DynamoDB.query vs AWS.DynamoDB.DocumentClient.query

Nel DocumentClient il documento afferma chiaramente:

The document client simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types.

...

Supply the same parameters as AWS.DynamoDB.query() with AttributeValues substituted by native JavaScript types.

Forse dove anche riferimento alla DynamoDB API Reference che di fatto non fa alcuna ipotesi sull'SDK utilizzato ma utilizza richieste HTTP semplici negli esempi.

Pertanto, utilizzando AWS.DynamoDB.DocumentClient si fornisce semplicemente una semplice mappa valore-chiave per ExpressionAttributeValues come suggerito da @ gior91.

3

Come indicato sopra, è necessario utilizzare DynamoDB Document Client se si desidera eliminare il tipo di trasmissione.

var docClient = new AWS.DynamoDB.DocumentClient(); 

... quindi è sufficiente utilizzare la notazione oggetto sopra elencata per chiamare l'API.

{ ':pub_id': '700'} 

imbattuto in questo problema me stesso, stavo usando DynamoDB() in alcuni luoghi e la docClient in altri, non poteva capirlo per un po ', ma che ti risolverlo.