こんにちは、dynamodbテーブルがあります。このテーブル内のすべてのアイテムをサービスに返すようにしたいのですが、順序は1つの属性でソートすることです。
このためにグローバルセカンダリインデックスを作成する必要がありますか?その場合、ハッシュキーはどうあるべきか、範囲キーは何ですか? (gsiでのクエリでは、GSIのハッシュキーで「EQ」コンパレータを指定する必要があることに注意してください。)
どうもありがとう!
エルベン
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のみが含まれていることがわかります。私が推測する結果は、このキーのソート順になります(まだプログラムでこの部分をチェックしていません!)
この問題を解決するために私が従ったアプローチは、以下のようにグローバルセカンダリインデックスを作成することです。これが最善のアプローチであるかどうかはわかりませんが、誰かに役立つ場合は投稿してください。
Hash Key | Range Key
------------------------------------
Date value of CreatedAt | CreatedAt
データを取得する日数を指定するためにHTTP APIユーザーに課される制限。デフォルトは24時間です。
このようにして、HashKeyを現在の日付として常に指定でき、RangeKeyは取得中に>および<演算子を使用できます。このようにして、データは複数のシャードに分散されます。
現在、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