ポイント: Amazon DynamoDBのクエリには、その独自の構文、特にハッシュキーとソートキーの習得が含まれます。このガイドは、キー条件式とフィルター式を含む基本的なクエリ操作の概要を提供し、例とセットアップ手順を示します。
- クエリにはハッシュキーが必要で、ソートキーを含めることもできます。
- キー条件式とフィルター式を理解することは、効果的なクエリのために不可欠です。
この記事では、DynamoDBクエリの基本を説明します。クエリ構文は他のデータベースとはかなり異なるため、慣れるまでに少し時間がかかります。
DynamoDBのハッシュキー
その複雑さの主な理由は、ハッシュキーなしでDynamoDBをクエリすることはできないためです。つまり、データベース全体をクエリすることは許可されていません。これは、他のデータベースで行うことができるフルテーブルスキャンを行うことができないことを意味します。
ただし、主キー(パーティションキー)は、ソートキーと呼ばれる2番目の属性を含むことができます。キー条件は=(等しい)である必要があります。しかし、ソートキーの演算子は次のようにできます:
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- between
各クエリには2つの異なる部分があります:
- キー条件クエリ(すなわち、パーティションキーのハッシュ)およびオプションでソートキー
- フィルター式(他の任意の属性をクエリ)
以下にいくつかの例を示しますが、まずはデータが必要です:
サンプルデータのロード
- DynamoDBをインストールしてローカルで実行します。これは、DynamoDBにデータを追加する方法で説明しました。
- ノードをインストールして、JavaScriptコードを実行します。
- ノードの一部であるAmazon SDKをnpmを使用してインストールします:
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- between
npm install aws-sdk
これらのプログラムをAmazonのJavaScript例から実行します:
- MoviesCreateTable.jsを実行して映画テーブルを作成します。
- こちらからサンプルデータをダウンロードして解凍します。
- MoviesLoadDataを実行してデータをロードします。
データを検査
データファイルの上部を見てください。これはネストされたJSONフィールドと配列を含む映画データベースです。したがって、教育演習として使用するように設計されています。
{
"year": 2013,
"title": "Rush",
"info": {
"directors": ["Ron Howard"],
"release_date": "2013-09-02T00:00:00Z",
"rating": 8.3,
"genres": [
"Action",
"Biography",
"Drama",
"Sport"
],
"image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg",
"plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.",
"rank": 2,
"running_time_secs": 7380,
"actors": [
"Daniel Bruhl",
"Chris Hemsworth",
"Olivia Wilde"
]
}
}
テーブルの説明
データがロードされたことを確認できます:
aws dynamodb describe-table --table-name Movies --endpoint-url http://localhost:8000
ここに最初のレコードがあります。
{
"Table": {
"TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/Movies",
"AttributeDefinitions": [
{
"AttributeName": "year",
"AttributeType": "N"
},
{
"AttributeName": "title",
"AttributeType": "S"
}
],
"ProvisionedThroughput": {
"NumberOfDecreasesToday": 0,
"WriteCapacityUnits": 10,
"LastIncreaseDateTime": 0.0,
"ReadCapacityUnits": 10,
"LastDecreaseDateTime": 0.0
},
"TableSizeBytes": 2095292,
"TableName": "Movies",
"TableStatus": "ACTIVE",
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "year"
},
{
"KeyType": "RANGE",
"AttributeName": "title"
}
],
"ItemCount": 4608,
"CreationDateTime": 1595056037.797
}
}
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- between
Amazon CLIコマンドラインインターフェースを使用してクエリを実行します。他のプログラミング言語のSDKを使用している場合、原則は同じです。唯一の違いは構文です。
クエリは2つの部分で構成されています:
クエリ構造
- キー条件式
- フィルター式
キー条件式
キー条件式にはパーティションキーとオプションでソートキーを含めることができます。この主キーをDynamoDBはパーティションキーと呼びます。2番目のキーも持つことができ、それはソートキーと呼ばれます。映画データベースでは、パーティションキー名はyearで、ソートキーはtitleです。パーティションキーのクエリ式では、等しい(=)のみが許可されます。ソートキーは
- 〈
- 〉
- _
- 〈=
- 〉=
- begins_with
- between
Amazonのサンプルデータには予約語yearが含まれています。したがって、その複雑さに事前に対処する必要があります。
以下にクエリがあります。各行の後にバックスラッシュ(\)を使用するのは、bashシェルでの継続文字です。そして、同じ理由でJSONを囲むためにシングルクオート(')を使用します。
aws dynamodb query \
--endpoint-url http://localhost:8000 \
--table-name Movies \
--key-condition-expression "#yr = :yyyy" \
--expression-attribute-names '{"#yr": "year"}' \
--expression-attribute-values '{ ":yyyy":{"N":"2010"}}'
クエリの各部分を分解してみましょう:
|
--key-condition-expression #yr = :yyyy |
この式の形式は: パーティションキー名 = プレースホルダー そして、ソートキーを追加することもできます。このデータベースではtitleです。しかし、ここではタイトルを探しているので、必要ありません。 ポンド(#)記号は、パラメータexpression-attribute-namesでそのパーティションキーのフィールド名を再定義することを意味します。通常はフィールド名を記述します。しかし、予約語であるyearを使用することはできません。 コロン(:)もプレースホルダーです。これは、key-condition-expressionで以下のように再定義することを意味します。 |
| --expression-attribute-names '{"#yr": "year"}' | これは、フィールドyearのエイリアスを提供する場所です。予約語であるyearをフィールド名として使用することはできません。 |
| --expression-attribute-values '{ ":yyyy":{"N":"2010"}}' |
これは、キーまたはフィルター式で使用されるプレースホルダーの展開または定義と考えることができます(フィルター式については後で説明します)。言い換えれば、キー条件で書いたのは:yyyy . これは一時的なプレースホルダーに過ぎません。ここでその値を定義します '{ ":yyyy":{"N":"2010"}}' Nは数字を意味します。Sは文字列。Bはバイナリです。 2010はターゲット値です。 |
キー条件は、パーティションに基づいてレコードのセットを選択する役割を果たします。データベースのサブセットを取得し、そのサブセットをフィルター式でクエリするという2段階のプロセスです。
以下の例では、2010年のすべての映画を表示し、評価が8.5を超えるものを表示したいと思います。(1)キー条件は年を取得し、(2)フィルター式は2010年のすべての映画を評価によってクエリできるようにします。このように設計されているのは、クエリするデータ量を減らすことによって速度を向上させるためです。
aws dynamodb query \
--endpoint-url http://localhost:8000 \
--table-name Movies \
--key-condition-expression "#yr = :yyyy" \
--expression-attribute-names '{"#yr": "year"}' \
--expression-attribute-values '{ ":yyyy":{"N":"2010"}}' \
--filter-expression 'info.rating > :rating' \
--expression-attribute-values '{
":yyyy":{"N":"2010"},
":rating": { "N": "8.5" }
}'
フィルター式はキー条件と同じ構文を持っていますが、いくつかの項目に注意が必要です。
| --filter-expression 'info.rating > :rating' \ |
フィルター式は、キー条件と同様に、左側に属性、中央に演算子、右側にプレースホルダーがあります。言い換えれば、これはJSONではなく、他の場所でJSONを使用するのとは異なります。 rating はinfoの下にネストされています。したがって、info.ratingと書きます。 |
|
--expression-attribute-values '{ ":yyyy":{"N":"2010"}, ":rating": { "N": "8.5" } }' |
上記のキー条件クエリでは、全く同じパラメータを使用しました。ここではJSON構文を使用します: --expression-attribute-values '{ ":yyyy":{"N":"2010"}}' ここでの唯一の違いは、プレースホルダーが2つある(:yyyyと:rting)ため、そのJSONに2行必要だということです: --expression-attribute-values '{ ":yyyy":{"N":"2010"}, ":rating": { "N": "8.5" } }' これは、フィルター式が常に同じクエリーキー条件を含む必要があることを示しています。したがって、それを繰り返す必要があります。 |
追加リソース
このトピックについて詳しくは、BMCビッグデータ&機械学習ブログを探索するか、次のリソースをチェックしてください:
- AWSガイド、AWSに関する15以上の記事とチュートリアル
- AWS、Azure、GCPのための可用性リージョンとゾーン
- AWSのデータベース:マルチクラウドの世界でのクラウドデータベースの位置付け
- データベースの信頼性の紹介
DynamoDBガイド
これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。