Как выразить Hash + Range в JSON для Dynamodb getItem на Node.js

У меня есть таблица под названием Message in Dynamodb. Ключ состоит из Hash (называемого entryStamp как Number) и Range (userId как String).

Я пытаюсь сделать на нем getItem с помощью Node.js Lambda. Я знаю, как получить элемент для другой таблицы с ключом Hash only, и это работает.

Но я не могу найти документацию о том, как изменить мой json, чтобы выразить часть ключа Range.

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);
    }
};

Вот информация в таблице на вкладке «Подробности» DynamoDB:

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

Вот что я передаю в event.messageId:

{
    "messageId": "1443768744451-testUser"
}

Заранее спасибо! Когда я отправляю это в getItem, я получаю следующее:

{
   "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)"
      ]
    }

person Gerard    schedule 02.10.2015    source источник
comment
Каковы фактические значения desiredSendStamp и userId в этом примере? Не могли бы вы также поделиться определением атрибута таблицы для Message таблицы?   -  person mkobit    schedule 02.10.2015
comment
выглядит нормально. Вы уверены, что хеш-ключ равен N, а userId - String (S)?   -  person Mircea    schedule 03.10.2015


Ответы (1)


Я думаю, что определение ключа в params не совсем правильное, вам не нужно указывать HashKeyElement и RangeKeyElement. Пытаться:

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

Кроме того, вы можете использовать класс DocumentClient в aws -sdk, если вы обновите.

person James    schedule 06.10.2015