2

Ich muss meine dynamo db Tabelle aktualisieren, indem ich nur den Partitionsschlüssel verwende. Aber ich habe Validierung Ausnahme. Ich habe eine Tabelle mit 3 Feldern erstellt.Kann Dynamo Db Tabelle nicht aktualisieren, ValidationException erhalten

  1. id (Partition Key)
  2. Name (Sort Key)
  3. Alter

Dann i triyed habe Altes Feld mit nur id zu aktualisieren. (Tryied Alter von 30 bis 40 zu ändern) das ist mein Code

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

Aber ich habe Fehler wie folgt.

{ [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 } 

Nach Fehler bekommen, ich meine params Variable wie diese diese

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

Mit geänderter wird updation erfolgreich abgeschlossen. Wie aktualisiert man Tabellen ohne Sortierschlüssel?

Antwort

1

Derzeit verfügt die DynamoDB-Aktualisierungs-API nicht über eine Option zum Aktualisieren des Elements nach Partitionsschlüssel. Es gibt auch keine batchUpdateItem-API, die batchWriteItem ähnlich ist.

Wenn also der Sortierschlüssel nicht verfügbar ist, holen Sie alle Sortierschlüssel des Partitionsschlüssels und aktualisieren Sie jedes Element für die Partition und Sortierschlüsselkombination.

Für den Primärschlüssel müssen Sie alle Attribute angeben. Für Beispiel mit einem einfachen Primärschlüssel müssen Sie nur einen Wert für den Partitionsschlüssel angeben. Bei einem zusammengesetzten Primärschlüssel müssen Sie Werte für den Partitionsschlüssel und den Sortierschlüssel angeben.

Beispielcode: -

Möglicherweise müssen Sie es für Ihre Tabelle ändern. Der folgende Code verwendet die Tabelle "Movies", die "yearkey" als Partitionsschlüssel und "title" als Sortierschlüssel hat.

Der folgende Code aktualisiert das Attribut "createate" für den angegebenen Hash-Schlüssel "2012".

Die Variable paramsUpdate wird basierend auf der Abfrageoperation gebildet. Bitte aktualisieren Sie es entsprechend für Ihre Anforderung (d. H. Tabellenstruktur). Logik bleibt gleich, Sie müssen nur den Tabellennamen und die Schlüsselwerte entsprechend ändern.

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++; 

     } 
    } 
}); 
1

In DynamoDB, Partitionsschlüssel + Sortierschlüssel als „composite Primärschlüssel“ behandelt wird, das eindeutig identifiziert, ein Element (im Gegenteil, unterstützt auch Dynamo einfachen Primärschlüssel, der nur Partitionsschlüssel enthält). Sie müssen also beide einen Artikel aktualisieren. Aus diesem Grund können Sie zwei Elemente mit demselben Partitionsschlüssel aber einem anderen Sortierschlüssel haben. Wenn Sie also nur die Partitionsschlüssel angeben, wird Dynamo mit dem zu aktualisierenden Element verwechselt.

Für Ihre aktuelle Tabellenkonfiguration, die einzige Möglichkeit, ein Element gegeben eine Partition Schlüssel zu aktualisieren, ist eine Abfrage mit nur Partition Schlüssel zu machen, alle Einzelteile zu erhalten, und Filter aus dem mit dem Sortierschlüssel bestimmt . Dann verwenden Sie die Kombination aus Partition Schlüssel und Sortierschlüssel Update dieses Element.

Verwandte Themen