DynamoDB验证异常 - 关键元素与架构

时间:2017-02-11 05:56:22

标签: javascript amazon-web-services amazon-dynamodb

我正在尝试从我的DynamoDB中获取一个项目但是出现以下错误

“ValidationException:提供的关键元素与架构

不匹配

代码的创建项目部分有效。但没有获取项目。

表格信息:

表名:movieTable

主分区键:itemID

主要排序键:sortKey

以下是创建和更新的代码:

        var fbUserId;
        var params;
        var keyText;
        var attText;
        var valText;
        var dynamodb = null;
        var docClient = null;
        var appId = '405140756489952'; //from facebook
        var roleArn = 'arn:aws:iam::042765862882:role/Verzosa'; //from AWS IAM
        var resultData = null;

        document.getElementById('putThis').onclick = function () {
            dynamodb = new AWS.DynamoDB({ region: 'us-west-2' });
            docClient = new AWS.DynamoDB.DocumentClient({ service: dynamodb });
            keyText = document.getElementById("keyValue").value;
            attText = document.getElementById("attributeText").value;
            valText = document.getElementById("valueText").value;
            console.log("Key Value: ", keyText);
            console.log("Attribute: ", attText);
            console.log("Value: ", valText);
            params = {
                TableName: 'movieTable',
                Item: {
                    itemID: keyText,
                    sortKey: valText
                }
            };
            docClient.put(params, function(err, data){
                          if (err) console.log(err);
                          else
                          {
                          resultData = data;
                          console.log(resultData);

                          }
                          })


        };

    document.getElementById('getThis').onclick = function () {
        dynamodb = new AWS.DynamoDB({ region: 'us-west-2' });
        docClient = new AWS.DynamoDB.DocumentClient({ service: dynamodb });
        keyText = document.getElementById("keyValue").value;
        attText = document.getElementById("attributeText").value;
        console.log("Key Value: ", keyText);
        console.log("Attribute: ", attText);
        params = {
            TableName: 'movieTable',
            Key: {
                itemID: keyText,
            },
            ProjectionExpression: "#a",
            ExpressionAttributeNames: {
                '#a': attText
            }
        };
        docClient.get(params, function (err, data)
                      {
                      if (err)
                      {
                      console.log(err, err.stack);
                      }
                      else
                      {
                      console.log("success, logging data: ");
                      console.log(data);//shows keys
                      console.log("attribute 1 is " + data.Item.sortKey)
                      //var output = data.Item.attribute1;
                      l = document.getElementById("output");
                      l.innerHTML = data.Item.sortKey;
                      }
                      })
    };

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

您收到此错误是因为在使用AWS.DynamoDB.DocumentClient.get方法时,必须同时指定项目的哈希和排序键。但是您只指定了散列键(itemId),并且缺少排序键。

以下是您获得params的样子:

  ...
  params = {
      TableName: 'movieTable',
      Key: {
          itemID: keyText,
          sortKey: valText   // <--- sort key added 
      },
      ProjectionExpression: "#a",
      ExpressionAttributeNames: {
          '#a': attText
      }
  };
  docClient.get(params, function (err, data) {
  ...

如果您只想使用哈希键获取记录,而不指定其排序键,则应使用query方法而不是get:

  ...
  params = {
      TableName: 'movieTable',
      KeyConditionExpression: '#itemID = :itemID',
      ProjectionExpression: "#a",
      ExpressionAttributeNames: {
          '#a': attText,
          '#itemID': 'itemID'
      },
      ExpressionAttributeValues: {
          ':itemID': keyText
      }
  };

  dynamodbDoc.query(params, function(err, data) {
  ...

请注意,虽然get方法总是返回1或没有记录,但查询可能会返回多条记录,因此您必须重新访问当前的get回调实现(例如,而不是访问data.Item,您应该使用data.Items数组,见query method docs