DynamoDB读取问题

时间:2018-09-03 21:05:17

标签: node.js amazon-web-services amazon-dynamodb

我的设备收集了一些数据,并使用其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"}

1 个答案:

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

请注意,timeStampDynamoDB reserved word。如果需要编写包含与DynamoDB保留字冲突的属性名称的表达式,则需要定义一个表达式属性名称以代替保留字。在此示例中,我将#t用于timeStamp

PS,将分区键作为时间戳记是不寻常的。通常,时间戳记是排序键,在您的情况下,message是项的简单属性,而不是排序键。您可能需要重新考虑数据库架构。如果您只是在寻找唯一的,不透明的标识符,则可以使用UUID。