Ausdrucksattributnamen in DynamoDB - Amazon DynamoDB

Ausdrucksattributnamen in DynamoDB

Ein Ausdrucksattributname ist ein Platzhalter, den Sie in einem Amazon-DynamoDB-Ausdruck als Alternative zu einem tatsächlichen Attributnamen verwenden. Ein Ausdrucksattributname muss mit einem Rautezeichen (#) beginnen, gefolgt von einem oder mehreren alphanumerischen Zeichen.

Dieser Abschnitt beschreibt einige Situationen, in denen Sie Ausdrucksattributnamen verwenden müssen.

Anmerkung

Für die Beispiele in diesem Abschnitt wird die AWS Command Line Interface (AWS CLI) verwendet. Informationen zum Programmieren von sprachspezifischen Codebeispielen finden Sie unter Erste Schritte mit DynamoDB und AWS SDKs.

Reservierte Wörter

In einigen Fällen kann es erforderlich sein, einen Ausdruck mit einem Attributnamen zu erstellen, der mit einem für DynamoDB reservierten Wort in Konflikt steht. (Eine vollständige Liste der reservierten Wörter finden Sie unter Reservierte Wörter in DynamoDB.)

Das folgende AWS CLI-Beispiel schlägt fehl, da COMMENT ein reserviertes Wort ist.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Comment"

Um dieses Problem zu vermeiden, können Sie Comment durch einen Ausdrucksattributnamen wie #c ersetzen. Das Rautezeichen # ist erforderlich und gibt an, dass es sich um einen Platzhalter für einen Attributnamen handelt. Das AWS CLI-Beispiel würde nun wie folgt aussehen:

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#c" \ --expression-attribute-names '{"#c":"Comment"}'
Anmerkung

Wenn ein Attributnamen mit einer Zahl beginnt oder ein Leerzeichen, ein Sonderzeichen oder ein reserviertes Wort enthält, müssen Sie einen Ausdrucksattributnamen verwenden, um den Namen des Attributs im Ausdruck zu ersetzen.

Attributnamen mit Punkten

In einem Ausdruck wird ein Punkt (".") als Trennzeichen in einem Dokumentpfad interpretiert. DynamoDB bietet allerdings die Möglichkeit, ein Punktzeichen als Teil eines Attributnamens zu verwenden. Dies kann in einigen Fällen zweideutig sein. Angenommen, Sie möchten das Attribut Safety.Warning aus einem ProductCatalog-Element abrufen (siehe Angeben von Elementattributen bei der Verwendung von Ausdrücken).

In diesem Beispiel gehen wir davon aus, dass Sie auf Safety.Warning mit einem Projektionsausdruck zugreifen möchten.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "Safety.Warning"

DynamoDB gibt statt der erwarteten Zeichenfolge („Always wear a helmet„) ein leeres Ergebnis zurück. Der Grund dafür ist, dass DynamoDB einen Punkt in einem Ausdruck als Dokumentpfadtrennzeichen interpretiert. In diesem Fall müssen Sie einen Ausdrucksattributnamen (z. B. #sw) als Ersatz für Safety.Warning definieren. Anschließend können Sie den folgenden Projektionsausdruck verwenden.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#sw" \ --expression-attribute-names '{"#sw":"Safety.Warning"}'

DynamoDB gibt dann das richtige Ergebnis zurück.

Verschachtelte Attribute

In diesem Beispiel gehen wir davon aus, dass Sie für den Zugriff auf das verschachtelte Attribut ProductReviews.OneStar den folgenden Projektionsausdruck verwenden.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.OneStar"

Das Ergebnis enthält wie erwartet alle 1-Stern-Produktrezensionen.

Doch welches Ergebnis erhalten Sie, wenn Sie stattdessen einen Ausdrucksattributnamen verwenden? Angenommen, Sie definieren #pr1star als Ersatz für ProductReviews.OneStar?

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr1star" \ --expression-attribute-names '{"#pr1star":"ProductReviews.OneStar"}'

DynamoDB würde statt der erwarteten Übersicht von 1-Stern-Rezensionen ein leeres Ergebnis zurückgeben. Der Grund dafür ist, dass DynamoDB einen Punkt in einem Ausdrucksattributnamen als Zeichen in einem Attributnamen interpretiert. Wenn DynamoDB den Ausdrucksattributnamen #pr1star auswertet, folgert die Anwendung, dass sich ProductReviews.OneStar auf ein skalares Attribut bezieht, was nicht beabsichtigt war.

Der richtige Ansatz wäre, einen Ausdrucksattributnamen für jedes Element im Dokumentpfad zu definieren:

  • #pr — ProductReviews

  • #1star — OneStar

Anschließend können Sie #pr.#1star für den folgenden Projektionsausdruck verwenden.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.#1star" \ --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'

DynamoDB gibt dann das richtige Ergebnis zurück.

Wiederholen von Attributnamen

Ausdrucksattributnamen sind hilfreich, wenn Sie sich wiederholt auf den gleichen Attributnamen beziehen müssen. Betrachten Sie z. B. den folgenden Ausdruck zum Abrufen einiger Rezensionen aus einem ProductCatalog-Element.

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"

Um den Ausdruck prägnanter zu gestalten, können Sie ProductReviews durch einen Ausdrucksattributnamen wie #pr ersetzen. Der geänderte Ausdruck sieht wie folgt aus:

  • #pr.FiveStar, #pr.ThreeStar, #pr.OneStar

aws dynamodb get-item \ --table-name ProductCatalog \ --key '{"Id":{"N":"123"}}' \ --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \ --expression-attribute-names '{"#pr":"ProductReviews"}'

Wenn Sie einen Ausdrucksattributnamen definieren, müssen Sie ihn im gesamten Ausdruck einheitlich verwenden. Sie dürfen außerdem nicht das Symbol # weglassen.