web-dev-qa-db-ja.com

並べ替えられた順序でのDynamodbスキャン

こんにちは、dynamodbテーブルがあります。このテーブル内のすべてのアイテムをサービスに返すようにしたいのですが、順序は1つの属性でソートすることです。

このためにグローバルセカンダリインデックスを作成する必要がありますか?その場合、ハッシュキーはどうあるべきか、範囲キーは何ですか? (gsiでのクエリでは、GSIのハッシュキーで「EQ」コンパレータを指定する必要があることに注意してください。)

どうもありがとう!

エルベン

37
Erben Mo

HashKeyを知っている場合、クエリはRangeキーでソートされたアイテムを返します。

「クエリ結果は常に範囲キーでソートされます。範囲キーのデータ型が数値の場合、結果は数値順に返されます。それ以外の場合、結果はASCII文字コード値。デフォルトでは、ソート順は昇順です。順序を逆にするには、falseに設定されたScanIndexForwardパラメーターを使用します。」クエリおよびスキャンオペレーション-Amazon DynamoDB: http://docs.aws.Amazon.com/amazondynamodb /latest/developerguide/QueryAndScan.html

ここで、「すべてのアイテム」を返す必要がある場合は、スキャンを意味します。スキャンの結果を注文できるとは思わない。

別のオプションは、GSIを使用することです。 (ここの例: https://stackoverflow.com/a/21786544/29591 )。ここで、GSIにはHashKeyのみが含まれていることがわかります。私が推測する結果は、このキーのソート順になります(まだプログラムでこの部分をチェックしていません!)

19
Sony Kadavan

この問題を解決するために私が従ったアプローチは、以下のようにグローバルセカンダリインデックスを作成することです。これが最善のアプローチであるかどうかはわかりませんが、誰かに役立つ場合は投稿してください。

Hash Key                 | Range Key
------------------------------------
Date value of CreatedAt  | CreatedAt

データを取得する日数を指定するためにHTTP APIユーザーに課される制限。デフォルトは24時間です。

このようにして、HashKeyを現在の日付として常に指定でき、RangeKeyは取得中に>および<演算子を使用できます。このようにして、データは複数のシャードに分散されます。

5
Gireesh

現在、dynamoDB スキャン ソートされた結果を返すことはできません。

使用する必要があります 問い合わせ ハッシュキーと範囲フィールドを持つ新しいグローバルセカンダリインデックス(GSI)を使用します。トリックは 同じ値が割り当てられたハッシュキー テーブル内のすべてのデータに対して。

すべてのデータに新しいフィールドを作成し、それを「ステータス」と呼び、値を「OK」または同様の値に設定することをお勧めします。

次に、すべての結果をソートするクエリは次のようになります。

{
    TableName: "YourTable",
    IndexName: "Status-YourRange-index",
    KeyConditions: {
        Status: {
            ComparisonOperator: "EQ", 
            AttributeValueList: [ 
                "OK"
            ]
        }
    },
    ScanIndexForward: false
}

GSIクエリの作成方法のドキュメントは、次の場所にあります。 http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/GSI.html#GSI.Querying

0
Deemoe