Auf einen Blick: DynamoDB Complex Queryies Cheat Sheet bietet fortgeschrittene Abfragetechniken für Amazon DynamoDB, einschließlich Schlüsselbedingungs- und Filterausdrücke. Es behandelt komplexe Abfragen wie BETWEEN und begins_with, mit praktischen Beispielen und Anleitungen zum Laden von Beispieldaten.
- Enthält Beispiele für verschiedene Abfragetypen und Ausdrücke.
- Bietet Anleitungen zum Laden von Musterdaten und zur Erstellung von Tabellen zur Übung.
Dies ist ein Artikel über komplexe Abfragen von Amazon DynamoDB und baut auf den Grundanfragen von DynamoDB auf.
Anfang
Denken Sie an die Grundregeln für Abfragen in DynamoDB:
- Die Abfrage enthält eine Schlüsselbedingung und einen Filterausdruck.
- Die Schlüsselbedingung wählt den Partitionsschlüssel und optional einen Sortierschlüssel.
- Die Partitionsschlüssel-Abfrage kann nur gleich (=) sein. Wenn Sie also einen zusammengesetzten Primärschlüssel möchten, fügen Sie einen Sortierschlüssel hinzu, damit Sie andere Operatoren als strikte Gleichheit verwenden können.
- Nachdem du eine Teilmenge der Datenbank mit der Schlüsselbedingung ausgewählt hast, kannst du diese durch das Schreiben eines Filterausdrucks eingrenzen. Das kann gegen jedes Attribut ausgeführt werden.
- Logische Operatoren (>, <, begins_with usw.) sind für Schlüsselbedingungen und Filterausdrücke gleich, außer dass Sie contains nicht als Schlüsselbedingung verwenden können.
Verwendung von DynamoDB-Filterausdrücken zur Verfeinerung von Abfrageergebnissen
Sie können einen DynamoDB-Filterausdruck nach Abschluss einer Abfrage anwenden, aber bevor sie Ergebnisse zurückgibt. So verbraucht Ihre Abfrage die gleiche Lesekapazität, die auf 1 MB Daten begrenzt ist. DynamoDB-Filterausdrücke enthalten keine Partitionsschlüssel oder Sortierschlüsselattribute – diese gehören zum Schlüsselbedingungsausdruck. Die Syntax ähnelt jedoch einem Schlüsselbedingungsausdruck und verwendet dieselben Komparatoren, Funktionen und logischen Operatoren.
Was sind DynamoDB-Schlüsselbedingungsausdrücke?
Verwenden Sie einen Schlüsselbedingungsausdruck, eine Spezifikation der zu lesenden Elemente aus einer Tabelle oder einem Index, um Suchkriterien anzugeben. Sie müssen den Namen und Wert des Partitionsschlüssels als Gleichheitsbedingung angeben. Sie haben auch die Möglichkeit, eine zweite Sortierschlüsselbedingung zu verwenden. Sie können jedoch keine Nicht-Schlüsselattribute verwenden. Beim Schreiben von Schlüsselbedingungsausdrücken können Sie folgende Vergleichsoperatoren verwenden: a = b — wahr, wenn das Attribut a gleich dem Wert b ist. a < b — wahr, wenn a kleiner als b ist. a ><= b — wahr, wenn a kleiner oder gleich b ist. a > b — wahr, wenn a größer als oder gleich b ist, und kleiner als oder gleich b. Sie können auch diese Funktion verwenden: begins_with (a, substr) — wahr, wenn der Wert von Attribut a mit einer bestimmten Teilzeichenkette beginnt.
Lastprobendaten
Um diese komplexen DynamoDB-Abfragen durchzuführen, benötigen wir einige Daten, mit denen wir arbeiten können. Laden Sie diese Beispieldaten von GitHub herunter, das sind Daten von IMDB , die ich leicht modifiziert habe.
Erstellen Sie eine Tabelle
In diesem Dokument verwenden wir DynamoDB auf einer lokalen Maschine. Deshalb geben wir –endpoint-url http://localhost:8000 an. Erstellen Sie die Titeltabelle folgendermaßen:
aws dynamodb create-table
--endpoint-url http://localhost:8000
--table-name title
--attribute-definitions AttributeName=tconst,AttributeType=S
AttributeName=primaryTitle,AttributeType=S
--key-schema AttributeName=tconst,KeyType=HASH
AttributeName=primaryTitle,KeyType=RANGE
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
Beachten Sie, dass der Primärschlüssel die Kombination aus den Attributen tconst (Partitionsschlüssel) und primaryTitle (Sortierschlüssel) ist. Für unsere Beispieldaten haben wir Daten wie unten gezeigt. Alle Partitionsschlüssel sind auf denselben Wert movie gesetzt. Dann ist der Movie primaryTitle der Sortierschlüssel.
{
"tconst": {
"S": "movie"
},
"primaryTitle": {
"S": "Travel Daze"
},
Dann laden Sie die Daten folgendermaßen:
aws dynamodb batch-write-item
--endpoint-url http://localhost:8000
--request-items file:////Users/walkerrowe/Documents/imdb/movies.json
--return-consumed-capacity TOTAL
--return-item-collection-metrics SIZE
Erweiterte Abfragen in DynamoDB
Zwischen den Abfragen
Nachfolgend ist ein DynamoDB-Beispiel zwischen Abfragen. Wir verwenden das erste (Space) und das letzte (ÿ) Zeichen im UTF-8-Zeichensatz, um alle Titel auszuwählen.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst and primaryTitle BETWEEN :fromTitle AND :toTitle"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":fromTitle":{"S":" "},
":toTitle":{"S":"ÿ"}
}'
Beginnt mit der Anfrage
Ein Beispiel für DynamoDB begins_with Abfrage ist unten aufgeführt.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst and begins_with(primaryTitle, :beginsWith)"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":beginsWith":{"S":"A"}
}'
Enthält-Anfrage
Im untenstehenden Beispiel mit der DynamoDB-Enthält schreiben wir einen Filterausdruck anstelle einer Schlüsselbedingung. Dies soll nur zeigen, wie man einen DynamoDB-Filterausdruck schreibt, im Gegensatz zu einer Schlüsselbedingung. Wie oben erwähnt, sind die Operatoren dieselben, außer dass man den Operator contains nicht als Schlüsselbedingung verwenden kann.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression 'contains(originalTitle, :containsStr)'
--expression-attribute-values '{
":tconst":{"S":"movie"},
":containsStr":{"S":"Brooklyn"}
}'
Attribut-exist-Anfrage
Um herauszufinden, ob ein Attribut existiert, verwenden Sie die Abfrage DynamoDB-Attribut existiert:
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression 'attribute_exists(genres)'
--expression-attribute-values '{
":tconst":{"S":"movie"}
}'
Attribute exist'-Abfrage
Um zu überprüfen, dass ein Attribut nicht existiert, verwenden Sie die Abfrage DynamoDB-Attribut nicht existiert:
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression 'attribute_not_exists(genres)'
--expression-attribute-values '{
":tconst":{"S":"movie"}
}'
IN Anfrage
Um einen Wert für die Zugehörigkeit zu einer Menge zu testen, kann man eine IN-Abfrage oder eine IN-Bedingung schreiben. Die Syntax der Argumente umfasst einen numerischen, Zeichen- oder Datumsausdruck mit einer expr_ist von klammergebundenen, komma-getrennten Ausdrücken, einer Tabellen-Unterabfrage und natürlich einer IN- oder NOT-IN-Abfrage.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "genres IN (:inDrama, :inComedy)"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":inDrama":{"S":"Drama"},
":inComedy":{"S":"Comedy"}
}'
String-Set-Abfrage
Eine Zeichenkettenmenge bezieht sich auf spezifische Attribute, die an Einträge in einem Datensatz angehängt sind. Wenn Sie beispielsweise Elemente in einer Datentabelle abfragen möchten, um alle Personen in einer Tabelle zu finden, die als "Akteure" identifiziert sind, würden Sie eine Zeichenkettenanfrage schreiben. Unsere Abfrage enthält Daten wie diese:
"actors": {
"SS": ["Anthony Quinn", "Marcel Marciano", "David Niven", "Peter Sellers"]
},
Eine Gleichheitsbedingung für dieses Stringset (SS)-Element würde also notwendigerweise all diese Strings enthalten.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "actors = :actors"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":actors":{"SS": ["Anthony Quinn", "Marcel Marciano", "David Niven", "Peter Sellers"]}
}'
Boolesche Abfrage
Boolesche Daten werden wie folgt gespeichert:
"isComedy": {
"BOOL": false
}
Du fragst also so ab:
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "isComedy = :isComedy"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":isComedy":{"BOOL":true}
}'
Abfragekartentyp
Die DynamoDB-Kartenabfrage ähnelt der verschachtelten Abfrage (siehe nächsten Punkt).
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "aditionalInfo = :aditionalInfo"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":aditionalInfo": {
"M": {"Location": {"S": "Bost"}, "Language": {"S": "FR"}}
}
}'
Verschachtelte Abfrage
Ein verschachteltes DynamoDB-Objekt enthält eine Karte. Sie beziehen sich auf das Element mit der Dot-Notation parent.child, zum Beispiel würden Sie für diese Daten aditionalInfo.Location schreiben.
"aditionalInfo": {
"M": {"Location": {"S": "Bost"}, "Language": {"S": "FR"}}
},
Standort ist ein reserviertes Wort, daher müssen wir ihm ein Alias geben:
--expression-attribute-names '{"#loc": "Location"}'
Und hier ist das verschachtelte DynamoDB-Abfragebeispiel:
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "aditionalInfo.#loc = :loc"
--expression-attribute-names '{"#loc": "Location"}'
--expression-attribute-values '{
":tconst":{"S":"movie"},
":loc": {"S": "Bost"}
}'
Projektionsausdruck
Wenn Sie einige Attribute im Vergleich zu allen Attributen in einer Tabelle lesen möchten, können Sie einen Projektionsausdruck verwenden. Damit können Sie die gewünschten Elemente entsprechend den Attributen angeben, die Sie namensgemäß angeben. Sie können mehrere Attribute angeben, wenn Sie die Attributnamen mit einem Komma trennen. Verwenden Sie diesen Projektionsausdruck, um die von DynamoDB zurückgegebenen Attribute zu begrenzen, da standardmäßig alle Attribute zurückgegeben werden.
aws dynamodb query
--endpoint-url http://localhost:8000
--table-name title
--key-condition-expression "tconst = :tconst"
--filter-expression "aditionalInfo = :aditionalInfo"
--expression-attribute-values '{
":tconst":{"S":"movie"},
":aditionalInfo": {
"M": {"Location": {"S": "Bost"}, "Language": {"S": "FR"}}
}
}'
--projection-expression "originalTitle, runtimeMinutes"
Zusätzliche Ressourcen
Mehr zu diesem Thema finden Sie im BMC Big Data & Machine Learning Blog oder schauen Sie sich diese Ressourcen an:
- AWS-Leitfaden mit 15+ Artikeln und Tutorials zu AWS
- Verfügbarkeitsregionen und -zonen für AWS, Azure & GCP
- Datenbanken auf AWS: Wie Cloud-Datenbanken in eine Multi-Cloud-Welt passen
- Eine Einführung in die Datenbankzuverlässigkeit
DynamoDB-Leitfaden
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.