ポイント: DynamoDB 複雑なクエリ チートシートは、Amazon DynamoDB における高度なクエリ手法を提供し、キー条件およびフィルター式を含みます。BETWEEN や begins_with などの複雑なクエリを扱い、サンプルデータのロードに関する実用的な例とガイダンスを提供します。
- さまざまなクエリタイプと式の例を含みます。
- サンプルデータのロードおよび実践用テーブルの作成に関するガイダンスを提供します。
この記事では、Amazon DynamoDB の複雑なクエリについて説明し、DynamoDB 基本クエリに基づいています。
始めに
DynamoDB でクエリを実行する際の基本ルールを覚えておいてください:
- クエリにはキー条件とフィルター式が含まれます。
- キー条件はパーティションキーを選択し、オプションでソートキーを選択します。
- パーティションキーのクエリは等しい (=) のみを許可します。したがって、複合主キーが必要な場合は、ソートキーを追加して厳密な等価以外の演算子を使用できるようにしてください。
- キー条件でデータベースのサブセットを選択した後、フィルター式を書くことでそれを絞り込むことができます。それは任意の属性に対して実行できます。
- 論理演算子 (>, <, begins_with など) はキー条件とフィルター式で同じですが、contains をキー条件として使用することはできません。
DynamoDB フィルター式を使用してクエリ結果を絞り込む
クエリが終了した後、結果を返す前に DynamoDB フィルター式を適用できます。そのため、クエリは同じ量の読み取り容量を消費し、これは 1 MB のデータに制限されています。DynamoDB フィルター式にはパーティションキーやソートキー属性は含まれず、それらはキー条件式に属します。ただし、構文はキー条件式と同様で、同じ比較演算子、関数、および論理演算子を使用します。
DynamoDB キー条件式とは何ですか?
テーブルまたはインデックスから読み取るアイテムの仕様を示すキー条件式を使用して、検索基準を示します。パーティションキー名と値を等価条件として含める必要があります。また、2 番目のソートキー条件を使用するオプションがあります。ただし、非キー属性を使用することはできません。キー条件式を書く際には、次の比較演算子を使用できます: a = b — 属性 a が値 b と等しい場合は true。 a < b — a が b より小さい場合は true。 a <= b — a が b 以下の場合は true。 a > b — a が b より大きい場合は true。 a >= b — a が b 以上の場合は true。 a BETWEEN b AND c — a が b 以上で、c 以下の場合は true。この関数も使用できます: begins_with (a, substr) — 属性 a の値が特定の部分文字列で始まる場合は true。
サンプルデータをロード
これらの複雑な DynamoDB クエリを実行するには、作業するデータが必要です。この サンプルデータを GitHub からダウンロードしてください。これは、私が少し修正した IMDB のデータです。
テーブルを作成
このドキュメントでは、ローカルマシンで DynamoDB を使用しています。したがって、–endpoint-url http://localhost:8000 を指定します。次のようにタイトルテーブルを作成します:
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
主キーは属性 tconst (パーティションキー) および primaryTitle (ソートキー) の組み合わせであることに注意してください。サンプルデータには、以下のようなデータがあります。すべてのパーティションキーは同じ値 movie に設定されています。次に、映画の primaryTitle がソートキーです。
{
"tconst": {
"S": "movie"
},
"primaryTitle": {
"S": "Travel Daze"
},
次に、データを次のようにロードします:
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
DynamoDB における高度なクエリ
Between クエリ
以下は DynamoDB の Between クエリの例です。UTF-8 文字セットの最初 (空白) と最後 (ÿ) の文字を使用して、すべてのタイトルを選択します。
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":"ÿ"}
}'
Begins with クエリ
DynamoDB の begins_with クエリの例は以下の通りです。
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"}
}'
Contains クエリ
DynamoDB の contains クエリの例は以下の通りで、キー条件の代わりにフィルター式を書きます。これは、DynamoDB フィルター式を書く方法を示すためのものであり、キー条件とは対照的です。上記で述べたように、演算子は同じですが、contains 演算子をキー条件として使用することはできません。
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"}
}'
属性が存在するクエリ
属性が存在するかどうかを確認するには、DynamoDB 属性存在クエリを使用します:
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"}
}'
属性が存在しないクエリ
属性が存在しないことを確認するには、DynamoDB 属性不存在クエリを使用します:
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 クエリ
集合内のメンバーシップに対して値をテストするには、IN クエリまたは IN 条件を記述できます。引数の構文には数値、文字、または日時式が含まれ、括弧で囲まれたカンマ区切りの式のリスト、テーブルサブクエリ、もちろん IN または NOT IN クエリが含まれます。
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"}
}'
文字列セットクエリ
文字列セットは、データのセットに添付された特定の属性を指します。たとえば、データのテーブルで「俳優」として識別されるすべての人を見つけるために、文字列セットクエリを記述します。私たちのクエリには次のようなデータが含まれています:
"actors": {
"SS": ["Anthony Quinn", "Marcel Marciano", "David Niven", "Peter Sellers"]
},
したがって、その文字列セット (SS) 要素に対する等価条件は必然的にすべての文字列を含む必要があります。
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"]}
}'
ブールクエリ
ブールデータはこのように保存されます:
"isComedy": {
"BOOL": false
}
したがって、次のようにクエリします:
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}
}'
マップ型クエリ
DynamoDB マップクエリは、ネストされたクエリに似ています (次の項目を参照)。
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"}}
}
}'
ネストされたクエリ
ネストされた DynamoDB オブジェクトは、マップを含むものです。ドット表記 parent.child を使用して要素を参照します。このデータの場合、aditionalInfo.Location と記述します。
"aditionalInfo": {
"M": {"Location": {"S": "Bost"}, "Language": {"S": "FR"}}
},
Location は予約語なので、エイリアスを付ける必要があります:
--expression-attribute-names '{"#loc": "Location"}'
そして、こちらがネストされた DynamoDB クエリの例です:
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"}
}'
プロジェクション式
テーブル内のすべての属性ではなく、一部の属性を読み取る必要がある場合は、プロジェクション式を使用できます。これにより、指定した属性に基づいて読み取るアイテムを指定できます。属性名をカンマで区切って複数の属性を指定できます。このプロジェクション式を使用して、DynamoDB によって返される属性を制限します。デフォルトではすべての属性が返されます。
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"
追加のリソース
このトピックについての詳細は、 BMC ビッグデータ & 機械学習ブログ を探るか、これらのリソースをチェックしてください:
- AWS ガイド、AWS に関する 15 以上の記事とチュートリアルが含まれています
- AWS、Azure & GCP のための可用性リージョンとゾーン
- AWS のデータベース: マルチクラウド環境におけるクラウドデータベースの適合
- データベースの信頼性についての紹介
DynamoDB ガイド
これらの投稿は私自身の意見であり、必ずしも BMC の立場、戦略、または意見を表すものではありません。