Paweł Łukasiewicz
2024-02-05
Paweł Łukasiewicz
2024-02-05
Udostępnij Udostępnij Kontakt
Wprowadzenie

Metoda UpdateItem pozwala na aktualizację elementu, jeżeli ten istnieje. Możemy ją wykorzystać do aktualizacji istniejących wartości atrybutów, dodania nowych atrybutów lub usunięcia atrybutów z istniejącej kolekcji. Jeżeli element, który ma określony klucz główny nie zostanie znaleziony dochodzi do dodania nowego elementu.

Pomijając kroki standardowe o których wspominałem w poprzednich wpisach musimy przygotować żądanie używając obiektu UpdateItem. Musimy jednak pamiętaj tutaj o dwóch scenariuszach:

  • jeżeli element nie istnieje, metoda UpdateItem dodaje nowy element używając klucza głównego, który został określony w danych wejściowych;
  • jeżeli element istnieje UpdateItem dokonuje aktualizacji w jeden z następujących sposobów:
    • operacja zastępuje istniejące wartości atrybutów wartościami podanymi w aktualizacji;
    • jeżeli atrybut podany w wejściu nie istnieje dochodzi do dodania nowego atrybutu;
    • jeżeli atrybut ma wartość null dochodzi do usunięcia atrybutu jeżeli jest obecny w danym elemencie;
    • możemy również wykorzystać operator ADD na danej operacji w celu dodania wartości do istniejącego zestawu (zestaw liczb lub łańcuchów tekstowych) lub matematycznie dodać (użyć liczby dodatniej) lub odjąć (użyć liczby ujemnej) od istniejącej wartości atrybutu numerycznego (wszystko będzie jasne na poniższym przykładzie);

Pamiętajcie, że metoda PutItem również pozwala na aktualizacje danych o czym przekonaliśmy się w poprzednim wpisie. Prostym przykładem jest wywołanie metody PutItem z elementem, którego klucz główny istnieje – dojdzie wówczas do zastąpienia całego elementu. Kolejny przykład to nie zdefiniowanie atrybutów w powyższej operacji – jeżeli istnieją w elemencie obecnym w tabeli dojdzie do ich usunięcia po wykonaniu metody PutItem. UpdateItem zaktualizuje tylko określone atrybuty wejściowe. Wszelkie inne (istniejące) atrybuty tego elementu pozostają niezmienione – pamiętajcie o tych różnicach tworząc swoje projekty.

Tym razem kolejne kroki to przygotowanie żądania przy wykorzystaniu klasy UpdateItemRequest oraz wiedzy dotyczącej sposobu działa metody aktualizującej istniejący element oraz wywołanie samej metody UpdateItem wykorzystując powyższe żądanie jako parametr tej metody.

Spójrzmy na poniższy przykład w którym dochodzi do aktualizacji elementu w tabeli CatCatalog. Dodajemy nowego inżyniera do istniejącej kolekcji i usuwamy istniejący atrybut Color. Zmniejszamy również delikatnie cenę samochodu:

public async Task<ActionResult<string>> UpdateItem() {

  var request = new UpdateItemRequest() {
    TableName = TableName,
      Key = new Dictionary<string, AttributeValue> () {
        {
          "Id",
          new AttributeValue {
            N = "1"
          }
        },
      },
      ExpressionAttributeNames = new Dictionary<string, string> () {
        {
          "#E",
          "Engineers"
        }, {
          "#C",
          "Color"
        }, {
          "#P",
          "Price"
        }, {
          "#NA",
          "NewAttribute"
        },
      },
      ExpressionAttributeValues = new Dictionary<string, AttributeValue> () {
        {
          ":enginner",
          new AttributeValue {
            SS = {
              "Inzynier Pawel",
              "Inzynier Maciek"
            }
          }
        }, {
          ":price",
          new AttributeValue {
            S = "999 000"
          }
        }, {
          ":newAttr",
          new AttributeValue {
            S = "Sample value"
          }
        }
      },
      UpdateExpression = "ADD #E :enginner SET #P = :price, #NA = :newAttr REMOVE #C"
  };

  // Powyższe wyrażenie (UpdateExpression) wykonuje następujące czynności
  // Dodanie dwóch nowych inżynierów do listy
  // Zredukowanie ceny samochodu
  //  - w tym przykładzie dokonaliśmy prostej aktualizacji
  //  - gdybyśmy działali na polu numerycznym moglibyśmy wykorzystać zapis matematyczny: #P = #P - :price
  // Dodanie nowego atrybutu do naszego elementu
  // Usunięcie atrybutu ‘Color’

  var response = await _amazonDynamoDB.UpdateItemAsync(request);

  return response.HttpStatusCode.ToString();
}

Korzystając z poprzedniego wpisu możemy pobrać dany element i sprawdzić jak wygląda po aktualizacji: DynamoDB: aktualizacja elementu