我在 dynamodb 中有一个名为 Message 的表。键由哈希(称为数字的entryStamp)和范围(称为字符串的userId)组成。
我正在尝试使用 Node.js Lambda 对其执行 getItem 操作。我知道如何使用仅哈希键为不同的表获取Item,并且它有效。
但是我找不到有关如何修改 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)"
]
}
最佳答案
我认为params
中的Key定义不太正确,您不需要指定HashKeyElement
和RangeKeyElement
。尝试:
var params = {
"ConsistentRead": false,
"Key": {
"entryStamp": desiredSendStamp,
"userId": userId
},
"ProjectionExpression": "message",
"ReturnConsumedCapacity": "NONE",
"TableName": "Message"
};
此外,您还可以使用 DocumentClient class如果您升级,现在就在 aws-sdk 包中。
关于amazon-web-services - 如何在 Node.js 上为 dynamodb getItem 在 JSON 中表达哈希 + 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32913544/