Проблемы с чтением DynamoDB - PullRequest
       15

Проблемы с чтением DynamoDB

0 голосов
/ 04 сентября 2018

Мое устройство собирает некоторые данные и отправляет его AWS, используя свой интерфейс IoT MQTT. Моя лямбда читает данные и сохраняет их в 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

Затем я пытаюсь запросить динамо в моем приложении для небольших узлов, и я не могу получить доступ к данным, используя следующий скрипт:

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 найден неожиданный ключ '0'. Ключ ['timeStamp']" ... и та же ошибка для чисел до 25.

Я могу получить ниже подробную информацию о своей таблице из 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 голосов
/ 04 сентября 2018

Проблема в том, что ваша таблица имеет составной первичный ключ 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 . Если вам нужно написать выражение, содержащее имя атрибута, которое конфликтует с зарезервированным словом DynamoDB, вам нужно определить имя атрибута выражения, которое будет использоваться вместо зарезервированного слова. Я использовал #t для timeStamp в этом примере.

PS Для ключа раздела необычно указывать временную метку. Обычно меткой времени будет ключ сортировки, а в вашем случае message будет простым атрибутом элемента, а не ключом сортировки. Возможно, вам придется переосмыслить вашу схему БД. Если вы просто ищете уникальный непрозрачный идентификатор, вы можете использовать UUID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...