2015-10-02 7 views
1

J'ai une table appelée Message dans dynamodb. La clé est composée d'un Hash (appelé entryStamp en tant que Number) et d'un Range (userId en tant que String). J'essaie de faire un getItem à l'aide de Node.js Lambda. Je sais comment getItem pour une table différente avec une clé de hachage seulement, et cela fonctionne.Comment exprimer une plage Hash + dans JSON pour dynamodb getItem sur Node.js

Mais je ne trouve pas de documentation sur la façon de modifier mon json pour exprimer la partie Range de la touche.

var doc = require('dynamodb-doc'); 
var dynamo = new doc.DynamoDB(); 
exports.handler = function(event, context) { 
    var messageIdParts = event.messageId.split("-"); 
    var desiredStampString = messageIdParts[0]; 
    var desiredSendStamp = Number(desiredStampString); 
    var userId = messageIdParts[1]; 

    var params = { 
     "ConsistentRead": false, 
     "Key": { 
      HashKeyElement: { "entryStamp": desiredSendStamp }, 
      RangeKeyElement: { "userId": userId } 
      }, 
     "ProjectionExpression": "message", 
     "ReturnConsumedCapacity": "NONE", 
     "TableName": "Message" 
    } 
    try { 
     dynamo.getItem(params, context.done); 
    } catch (e) { 
     console.log("Exception for getItem: " + e); 
    } 
}; 

est ici l'info sur la table de l'DynamoDB onglet "Détails":

Table Name: Message 
Primary Hash Key: entryStamp (Number) 
Primary Range Key: userId (String) 
Table Status: Active 

Voici ce que je passe à event.messageId:

{ 
    "messageId": "1443768744451-testUser" 
} 

Merci à l'avance! Lorsque j'envoie ci-dessus à getItem, je reçois ceci:

{ 
    "errorMessage": "The provided key element does not match the schema", 
    "errorType": "ValidationException", 
    "stackTrace": [ 
     "Request.extractError (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/protocol/json.js:40:27)", 
     "Request.callListeners (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:100:18)", 
     "Request.emit (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:77:10)", 
     "Request.emit (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:604:14)", 
     "Request.transition (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:21:12)", 
     "AcceptorStateMachine.runTo (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/state_machine.js:14:12)", 
     "/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/state_machine.js:26:10", 
     "Request.<anonymous> (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:22:9)", 
"Request.<anonymous> (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/request.js:606:12)", 
     "Request.callListeners (/var/runtime/node_modules/dynamodb-doc/node_modules/aws-sdk/lib/sequential_executor.js:104:18)" 
     ] 
    } 
+0

Pourriez-vous également partager la définition d'attribut de table pour la table 'Message'? – mkobit

+0

semble correct. Êtes-vous sûr que la clé de hachage est N et que userId est une chaîne (S)? – Mircea

Répondre

0

Je pense que la définition clé dans params n'est pas tout à fait raison, vous n'avez pas besoin de spécifier HashKeyElement et RangeKeyElement. Essayez:

var params = { 
     "ConsistentRead": false, 
     "Key": { 
      "entryStamp": desiredSendStamp, 
      "userId": userId 
      }, 
     "ProjectionExpression": "message", 
     "ReturnConsumedCapacity": "NONE", 
     "TableName": "Message" 
}; 

En outre, vous pouvez utiliser le DocumentClient class dans le paquet-aws sdk maintenant, si vous mettez à niveau. Que sont les valeurs réelles `desiredSendStamp` et` userId` dans cet exemple?