NoSQLはかなり新しく、AWS DynamoDBを使用しています。 python= 2.7を使用してAWS Lambdaから呼び出しています。2.7「order_number」フィールドから値を取得しようとしています。
これは私のテーブルの外観です(レコードは1つだけです)。
プライマリパーティションキー:subscription_id
と私の二次グローバルインデックス:order_number
私の設定は正しいですか?その場合、order_numberを指定して、Pythonを使用してレコードを取得するにはどうすればよいですか?
構文を理解できません。
私はもう試した
response = table.get_item( Key = {'order_number': myordernumber} )
しかし、私は得る:
GetItem操作の呼び出し時にエラーが発生しました(ValidationException):指定されたキー要素がスキーマと一致しません:ClientError
DynamoDBは、オブジェクトのすべてのフィールドに自動的にインデックスを付けるわけではありません。デフォルトでは、ハッシュキー(subscription_id
の場合)を定義でき、オプションで範囲キーを定義すると、それらにインデックスが付けられます。だから、これを行うことができます:
response = table.get_item(Key={'subscription_id': mysubid})
期待どおりに動作します。ただし、order_number
に基づいてアイテムを取得する場合は、scan
操作を使用して、テーブル内のすべてのアイテムを調べ、正しい値を持つアイテムを見つける必要があります。これは非常に高価な操作です。または、order_number
を主キーとして使用するグローバルセカンダリインデックスをテーブルに作成することもできます。それを行って新しいインデックスorder_number-index
を呼び出した場合、次のように特定の注文番号に一致するオブジェクトをクエリできます。
from boto3.dynamodb.conditions import Key, Attr
response = table.query(
IndexName='order_number-index',
KeyConditionExpression=Key('order_number').eq(myordernumber))
DynamoDBは非常に高速でスケーラブルで効率的なデータベースですが、どのフィールドを検索するのか、どのように効率的に行うのかについて多くのことを考える必要があります。
良いニュースは、GSIを既存のテーブルに追加できるようになったことです。以前は、テーブルを削除して最初からやり直す必要がありました。
これをインポートしたことを確認してください:
from boto3.dynamodb.conditions import Key, Attr
それがない場合は、間違いなくエラーが発生します。 ドキュメントの例 にあります。
これは私にとって正しい答えなので、上記のコメントを@altoidsに感謝します。 「フォーマル」な答えで注目を集めたかった。