Amazon DynamoDBのクエリ方法

Amazon DynamoDBのクエリ方法

  • オーケストレーション
6分で読めます 更新日 Jul 23, 2020

ポイント: Amazon DynamoDBのクエリには、その独自の構文、特にハッシュキーとソートキーの習得が含まれます。このガイドは、キー条件式とフィルター式を含む基本的なクエリ操作の概要を提供し、例とセットアップ手順を示します。

  • クエリにはハッシュキーが必要で、ソートキーを含めることもできます。
  • キー条件式とフィルター式を理解することは、効果的なクエリのために不可欠です。

この記事では、DynamoDBクエリの基本を説明します。クエリ構文は他のデータベースとはかなり異なるため、慣れるまでに少し時間がかかります。

DynamoDBのハッシュキー

その複雑さの主な理由は、ハッシュキーなしでDynamoDBをクエリすることはできないためです。つまり、データベース全体をクエリすることは許可されていません。これは、他のデータベースで行うことができるフルテーブルスキャンを行うことができないことを意味します。

ただし、主キー(パーティションキー)は、ソートキーと呼ばれる2番目の属性を含むことができます。キー条件は=(等しい)である必要があります。しかし、ソートキーの演算子は次のようにできます:

  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • between

各クエリには2つの異なる部分があります:

  1. キー条件クエリ(すなわち、パーティションキーのハッシュ)およびオプションでソートキー
  2. フィルター式(他の任意の属性をクエリ)

以下にいくつかの例を示しますが、まずはデータが必要です:

サンプルデータのロード

  1. DynamoDBをインストールしてローカルで実行します。これは、DynamoDBにデータを追加する方法で説明しました。
  2. ノードをインストールして、JavaScriptコードを実行します。
  3. ノードの一部であるAmazon SDKをnpmを使用してインストールします:
  • 〈
  • 〉
  • _
  • 〈=
  • 〉=
  • begins_with
  • between
    npm install aws-sdk

これらのプログラムをAmazonのJavaScript例から実行します:

  1. MoviesCreateTable.jsを実行して映画テーブルを作成します。
  2. こちらからサンプルデータをダウンロードして解凍します。
  3. 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つの部分で構成されています:

クエリ構造

  1. キー条件式
  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ビッグデータ&機械学習ブログを探索するか、次のリソースをチェックしてください:

これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

オーケストレーションの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。