2017-01-26 2 views
10

Ich führe einen in Node.js geschriebenen AWS Lambda-Dienst aus, der mit einer DynamoDB-Datenbank interagiert. Eine meiner Methoden führt ein Update (AWS.DynamoDB.DocumentClient(). Update) auf DynamoDB durch, um ein bestimmtes Element zu aktualisieren. Mein Problem ist jedoch, dass wenn ich versuche, ein Element zu aktualisieren, und dieses Element nicht existiert, dann fügt die Update-Methode dieses neue Element meiner Tabelle hinzu. Dieses Verhalten ist der Standard, der auch in documentation beschrieben wird.DynamoDB: So verhindern Sie das Erstellen eines neuen Elements in UpdateItem, wenn das Element nicht existiert

Ich möchte nicht, dass meine Methode ein neues Element erstellt, wenn es noch nicht existiert. Ich möchte, dass dies nur dann ein Update ist, wenn der Datensatz existiert. Wenn es nicht existiert, muss es nichts tun. Wie erreiche ich das? Ich erwarte, dass ich eine ConditionalExpression verwenden kann, um dies zu erreichen, aber die Versuche, die ich dabei gemacht habe, waren nicht erfolgreich.

Ein Beispiel für die aktuellen Parameter, die ich an die Update-Funktion sende, finden Sie weiter unten. In diesem Beispiel möchte ich den Benutzer aktualisieren, die userId 123 und ich möchte, um das isActive Feld auf ‚false‘ für diesen Benutzer hat (aber ich möchte nur, dies zu tun, wenn der Benutzer 123 existiert tatsächlich!)

const params = { 
    TableName: 'users', 
    Key: { 
     userId: '123', 
    }, 
    ExpressionAttributeValues: { 
     ':isActive': 'false' 
    }, 
    UpdateExpression: 'SET isActive = :isActive', 
    ReturnValues: 'ALL_NEW', 
}; 

Antwort

12

Sie können dazu ConditionExpression verwenden. Die Aktualisierung findet statt, wenn der Schlüssel (d. H. UserId) vorhanden ist und das Aktualisierungsattribut (d. H. IsActive) ungleich dem neuen Wert entspricht, den Sie zu aktualisieren versuchen.

ConditionExpression: "userId = :userIdVal and isActive <> :isActiveVal", 
ExpressionAttributeValues: { 
    ':isActive' : 'false', 
    ':userIdVal' : '123' 
}, 

EDIT: -

Das sollte funktionieren. Es sollte ConditionExpression (nicht ConditionalExpression) sein.

var params = { 
TableName: 'users', 
Key: { 
    'userId': '123' 
}, 
UpdateExpression: 'SET isActive = :isActiveVal', 
ConditionExpression: 'userId = :userIdVal and isActive <> :isActiveVal', 
ExpressionAttributeValues: { 
    ':userIdVal' : '123', 
    ':isActiveVal': 'false' 
}, 
ReturnValues: "ALL_NEW" 
}; 
+0

Dies ist eine der Optionen, die ich tatsächlich ausprobiert habe. Wenn ich dies tue, erhalte ich eine Ausnahme, ValidationException: Wert in ExpressionAttributeValues, der in Ausdrücken nicht verwendet wird: keys: {: userIdVal} – Stanley

+0

Es sieht so aus, als hätten Sie die userIdVal nicht im Ausdruck angegeben. Haben Sie diesen Teil "userId =: userIdVal" in ConditionExpression aufgenommen? – notionquest

+0

In der Tat habe ich und Rechtschreibung und Syntax überprüft. – Stanley

0

ConditionExpression ist der Weg zu gehen, aber Sie können auch die attribute_exists Funktion:

ConditionExpression: 'attribute_exists(userId)' 

Es wird nur die Zeile mit dem richtigen Schlüssel aktualisieren und einen ConditionalCheckFailedException werfen, wenn doesn‘angeforderte Schlüssel t existieren.

Das Ziel ist offensichtlicher und Sie können die zusätzliche userId-Bindung überspringen.

ref: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

Verwandte Themen