我的设备收集了一些数据,并使用其IoT MQTT接口将其发送给AWS。 我的lambda读取数据并将其保存到DynamoDB。 下面是我的发电机中的一个示例记录,其中timeStamp是主分区键。
Item{3}
message String: DOWN
payloadMap{4}
direction String: -
message String: DOWN
timeStamp String: 2018-08-30 07:18:09.247373
value String: -70.0000
timeStamp String: 2018-08-30 07:18:09.247373
然后,我试图在我的小节点应用程序上查询dynamo,但无法使用以下脚本访问数据:
dynamodb.getItem({
TableName: 'myTableName',
Key: {
'timeStamp' : {'S': '2018-08-30 07:18:09.247373'}
}
},(err,result)=>{
if(err){
console.log(err);
}
else {
console.log('success');
}
});
下面是我的dynamoDB初始化:
function initDynamoAWS(){
AWS.config.apiVersion = {dynamodb: '2012-08-10'};
AWS.config.update({accessKeyId:access_key_id,
secretAccessKey:secret_access_key,
region:'us-west-2'});
dynamodb = new AWS.DynamoDB({ARN:ARN});
}
所有凭据都很好,因为我可以获得dynamodb.describeTable的所有详细信息,但是我无法从表中获得单个项目,但是我只能获得“错误:提供的键元素与架构不匹配”。 我想念什么?
当我将代码更改为:
let params = {};
let key = {'timeStamp' :'2018-08-30 07:18:09.247373'};
params.TableName = 'myTableName';
params.Key = key;
dynamodb.getItem(params,(err,result)=>{
if(err){
// debugger;
console.log(err);
}
else {
console.log('success');
}
});
我遇到了另一个错误: “ InvalidPatemeterType:预期params.Key ['timeStamp']为结构” “ UnexpectedPatameter:在params.Key ['timeStamp']中发现了意外的键'0'” ...对于最多25个数字也存在相同的错误。
我可以通过“ describe table”从AWS获取以下有关我的表的详细信息
Table : AttributeDefinitions :
Array(2)
0 : AttributeName : "message"
AttributeType : "S"
1 : AttributeName : "timeStamp"
AttributeType : "S"
ItemCount : 42
TableSizeBytes : 5434 TableStatus : "ACTIVE"
KeySchema:
Array(2)
0:{AttributeName: "timeStamp", KeyType: "HASH"}
1:{AttributeName: "message", KeyType: "RANGE"}
答案 0 :(得分:1)
问题是您的表具有timeStamp + message
的组合主键。为了从该表中获取项目,您需要提供该项目的完整密钥。您只提供时间戳。
如果要查找与特定时间戳匹配的所有项目,则需要使用query而不是getItem。
以下是使用查询的示例:
const params = {
ExpressionAttributeValues: {
':v1': {
S: '2018-08-30 07:18:09.247373',
},
},
KeyConditionExpression: '#t = :v1',
ExpressionAttributeNames: { '#t': 'timeStamp' },
TableName: 'myTableName',
};
dynamodb.query(params, (err, data) => {
if (err) {
console.log('query error:', err);
} else {
console.log('query data:', data);
}
});
请注意,timeStamp
是DynamoDB reserved word。如果需要编写包含与DynamoDB保留字冲突的属性名称的表达式,则需要定义一个表达式属性名称以代替保留字。在此示例中,我将#t
用于timeStamp
。
PS,将分区键作为时间戳记是不寻常的。通常,时间戳记是排序键,在您的情况下,message
是项的简单属性,而不是排序键。您可能需要重新考虑数据库架构。如果您只是在寻找唯一的,不透明的标识符,则可以使用UUID。