2017-01-26 51 views
10

Używam usługi AWS Lambda napisanej w Node.js, która współdziała z bazą danych DynamoDB. Jedna z moich metod wykonuje aktualizację (AWS.DynamoDB.DocumentClient(). Update) na DynamoDB, aby zaktualizować konkretny element. Mój problem polega jednak na tym, że gdy próbuję zaktualizować element i ten element nie istnieje, to metoda aktualizacji dodaje ten nowy element do mojej tabeli. To zachowanie jest domyślnie opisane w documentation.DynamoDB: Jak zapobiec tworzeniu nowego elementu w UpdateItem, jeśli element nie istnieje

Nie chcę, aby moja metoda tworzyła nowy element, jeśli jeszcze nie istnieje. Chcę, żeby była to aktualizacja tylko wtedy, gdy istnieje zapis. Jeśli nie istnieje, nie może nic zrobić. Jak to osiągnąć? Oczekuję, że będę mógł użyć ConditionalExpression, aby to osiągnąć, ale próby, które zrobiłem, nie zakończyły się sukcesem.

Przykład bieżących parametrów wysyłanych do funkcji aktualizacji podano poniżej. W tym przykładzie chcę zaktualizować użytkownika, który ma userid 123 i chcę ustawić pole isActive do „false” dla tego użytkownika (ale tylko chcesz to zrobić, jeśli użytkownik 123 rzeczywiście istnieje!)

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

Odpowiedz

12

Możesz użyć do tego celu ConditionExpression. Aktualizacja nastąpi, jeśli klucz (tj. Identyfikator użytkownika) jest obecny i atrybut aktualizacji (tj. IsActive) nie jest równy dla nowej wartości, którą próbujesz zaktualizować.

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

EDIT: -

to powinno działać. Powinien to być ConditionExpression (nie ConditionalExpression).

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

Jest to jedna z opcji, które faktycznie wypróbowałem. Kiedy to zrobię, otrzymuję wyjątek, ValidationException: Wartość podana w wyrażeniach ExpressionAttributeValues ​​nieużywanych w wyrażeniach: keys: {: userIdVal} – Stanley

+0

Wygląda na to, że nie podano wartości userIdVal w wyrażeniu. Czy włączono tę część "userId =: userIdVal" w ConditionExpression? – notionquest

+0

Rzeczywiście mam i sprawdziłem pisownię i składnię. – Stanley