Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无法更新Dynamo Db表,正在获取ValidationException_Node.js_Amazon Web Services_Amazon Dynamodb_Aws Sdk_Nosql - Fatal编程技术网

Node.js 无法更新Dynamo Db表,正在获取ValidationException

Node.js 无法更新Dynamo Db表,正在获取ValidationException,node.js,amazon-web-services,amazon-dynamodb,aws-sdk,nosql,Node.js,Amazon Web Services,Amazon Dynamodb,Aws Sdk,Nosql,我需要只使用分区键来更新我的dynamo db表。但我有一个例外。 我创建了一个包含3个字段的表 id(分区键) 名称(排序键) 年龄 然后我只使用id更新年龄字段(尝试将年龄修改为30到40岁)。这是我的代码 var AWS = require("aws-sdk"); AWS.config.update({ region: "us-east-1", }); var params = { TableName: 'test', Key: { id: '100' },

我需要只使用分区键来更新我的dynamo db表。但我有一个例外。 我创建了一个包含3个字段的表

  • id(分区键)
  • 名称(排序键)
  • 年龄
  • 然后我只使用id更新年龄字段(尝试将年龄修改为30到40岁)。这是我的代码

    var AWS = require("aws-sdk");
    
    AWS.config.update({
        region: "us-east-1",
    
    });
    
    var params = {
        TableName: 'test',
        Key: { id: '100' },
        UpdateExpression: 'set #age = :age ',
        ConditionExpression: '#age = :testAge',
        ExpressionAttributeNames: { '#age': 'age' },
        ExpressionAttributeValues: { ':age': '40', ':testAge': '30' }
    };
    
    var docClient = new AWS.DynamoDB.DocumentClient();
    docClient.update(params, function (err, data) {
        if (err) {
            console.log(err);
        }
        else {
            console.log(data);
        }
    });
    
    但我犯了这样的错误

    { [ValidationException: The provided key element does not match the schema]
      message: 'The provided key element does not match the schema',
      code: 'ValidationException',
      time: Thu Nov 17 2016 22:38:01 GMT+0530 (IST),
      requestId: '34PNMFM6CEACQIRHTSV77OI0JRVV4KQNSO5AEMVJF66Q9ASUAAJG',
      statusCode: 400,
      retryable: false,
      retryDelay: 0 }
    
    得到错误后,我修改了params变量,如下所示

     var params = {
            TableName: 'test',
            Key: { id: '100',name: 'manaf' },
            UpdateExpression: 'set #age = :age ',
            ConditionExpression: '#age = :testAge',
            ExpressionAttributeNames: { '#age': 'age' },
            ExpressionAttributeValues: { ':age': '40', ':testAge': '30' }
        };
    

    使用此选项,更新将成功完成。如何在不使用排序键的情况下更新表?

    目前,DynamoDB update API没有仅按分区键更新项的选项。也没有类似于batchWriteItem的batchUpdateItem API

    因此,如果排序键不可用,则获取分区键的所有排序键,并更新分区和排序键组合的每个项

    对于主键,必须提供所有属性。对于 例如,对于一个简单的主键,您只需要提供一个值 对于分区键。对于复合主键,必须提供 分区键和排序键的值

    示例代码:-

    您可能需要为您的桌子更换它。下面的代码使用“Movies”表,其中“yearkey”作为分区键,“title”作为排序键

    下面的代码更新给定哈希键“2012”的“createdate”属性

    变量paramsUpdate是根据查询操作形成的。请根据您的要求进行相应更新(即表格结构)。逻辑保持不变,只需相应地更改表名和键值

    var AWS = require("aws-sdk");
    var creds = new AWS.Credentials('akid', 'secret', 'session');
    
    AWS.config.update({
        region : "us-west-2",
        endpoint : "http://localhost:8000",
        credentials : creds
    });
    
    var docClient = new AWS.DynamoDB.DocumentClient();
    
    var hashKey = 2012;
    
    var paramsQuery = {
        TableName : "Movies",
        KeyConditionExpression : 'yearkey = :hkey',
        ExpressionAttributeValues : {
            ':hkey' : hashKey
    
        }
    };
    
    function updateItem(paramsUpdate) {
        console.log("Updating the item...");
        docClient.update(paramsUpdate, function(err, data) {
            if (err) {
                console.error("Unable to update item. Error JSON:", JSON.stringify(
                        err, null, 2));
            } else {
                console.log("UpdateItem succeeded:", JSON.stringify(data));
            }
        });
    }
    
    docClient.query(paramsQuery, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err,
                    null, 2));
        } else {
            console.log(data.Count);
            var itemIndex = 0;
            while (itemIndex < data.Count) {
    
                console.log('Hashkey to be updated ======>',
                         data.Items[itemIndex].yearkey,
                         ';Title to be updated ========>',
                         data.Items[itemIndex].title);
                var paramsUpdate = {
                    TableName : "Movies",
                    Key : {
                        "yearkey" : data.Items[itemIndex].yearkey,
                        "title" : data.Items[itemIndex].title
                    },
                    UpdateExpression : "set #createdate = :createdate",
                    ExpressionAttributeNames : {
                        '#createdate' : 'createdate'
                    },
                    ExpressionAttributeValues : {
                        ':createdate' : '2016-11-17'
                    },
                    ReturnValues : 'UPDATED_NEW'
                };
                updateItem(paramsUpdate);
                itemIndex++;
    
            }
        }
    });
    
    var AWS=require(“AWS sdk”);
    var creds=新的AWS.Credentials('akid','secret','session');
    AWS.config.update({
    地区:“美国西部2号”,
    端点:“http://localhost:8000",
    证书:信誉
    });
    var docClient=new AWS.DynamoDB.DocumentClient();
    var hashKey=2012;
    变量参数={
    表名:“电影”,
    KeyConditionExpression:'yearkey=:hkey',
    表达式属性值:{
    “:hkey”:哈希键
    }
    };
    函数updateItem(paramsUpdate){
    日志(“更新项目…”);
    更新(paramsUpdate,函数(err,data){
    如果(错误){
    console.error(“无法更新项。错误JSON:”,JSON.stringify(
    err,null,2);
    }否则{
    log(“UpdateItem successed:”,JSON.stringify(data));
    }
    });
    }
    查询(参数,函数(错误,数据){
    如果(错误){
    console.error(“无法读取项。错误JSON:”,JSON.stringify(err,
    空,2);
    }否则{
    console.log(data.Count);
    var itemIndex=0;
    while(itemIndex',
    data.Items[itemIndex].yearkey,
    “;要更新的标题========>”,
    data.Items[itemIndex].title);
    变量paramsUpdate={
    表名:“电影”,
    关键:{
    “yearkey”:data.Items[itemIndex].yearkey,
    “标题”:数据。项目[itemIndex]。标题
    },
    UpdateExpression:“设置#createdate=:createdate”,
    表达式属性名称:{
    “#createdate”:“createdate”
    },
    表达式属性值:{
    “:createdate”:“2016-11-17”
    },
    ReturnValues:“更新的\新的”
    };
    updateItem(paramsUpdate);
    itemIndex++;
    }
    }
    });
    
    在DynamoDB中,分区键+排序键被视为“复合主键”,它唯一地标识一个项(相反,Dynamo还支持简单主键,它只包含分区键)。因此,您需要同时更新项目。这就是为什么可以有两个具有相同分区键但不同排序键的项。因此,如果您只提供分区键,Dynamo将不知道要更新哪个项

    对于当前表配置,更新给定分区键的项的唯一方法是使用分区键进行查询,以获取所有项,并筛选出使用预期排序键的项。然后使用分区键和排序键的组合来更新该项