web-dev-qa-db-ja.com

DynamoDBはマップまたはリストタイプにインデックスを作成します

DynamoDBのマップオブジェクト内の属性にインデックスを追加しようとしていますが、追加する方法が見つからないようです。これはサポートされているものですか、それとも実際にインデックスはスカラー値でのみ許可されていますか?この周りのドキュメントはかなりまばらであるようです。インデックス作成機能がMongoDBに似ていることを期待していますが、これまでのところ、ドット構文を使用してインデックスを作成するために属性を参照するために行ってきたアプローチは成功していません。提供できるヘルプや追加情報はありがたいです。

34
BryceH

インデックスは、最上位のJSON属性でのみ作成できます。さらに、範囲キーはDynamoDBのスカラー値である必要があります(文字列、数値、バイナリ、ブールのいずれか)。

から http://aws.Amazon.com/dynamodb/faqs/

Q:DynamoDBでのJSONデータのクエリに違いはありますか?

いいえ。トップレベルのJSON要素にグローバルセカンダリインデックスまたはローカルセカンダリインデックスを作成できます。たとえば、人に関する次の情報を含むJSONドキュメントを保存したとします:名、姓、郵便番号、およびすべての友達のリスト。名、姓、郵便番号は最上位のJSON要素になります。インデックスを作成して、名、姓、または郵便番号に基づいてクエリを実行できます。友達のリストはトップレベルの要素ではないため、友達のリストにインデックスを付けることはできません。グローバルセカンダリインデックスとそのクエリ機能の詳細については、このFAQのセカンダリインデックスのセクションを参照してください。

Q:インデックスを作成できるのはどのデータタイプですか?

すべてのスカラーデータタイプ(数値、文字列、バイナリ、ブール)は、ローカルセカンダリインデックスキーの範囲キー要素に使用できます。セット、リスト、マップタイプにはインデックスを作成できません。

34
Ben Schwartz

オブジェクトを個別に保存しながら、hash(str(object))を実行してみました。このハッシュは私に整数(数値)を与え、それにセカンダリインデックスを使用することができます。 以下はpythonのサンプルです 、値に対して毎回同じハッシュキーを生成するハッシュ関数を使用することが重要です。だから私はsha1を使っています。

# Generate a small integer hash:
import hashlib
def hash_8_digits(source):
    return int(hashlib.sha1(source.encode()).hexdigest(), 16) % (10 ** 8)

アイデアは、エンティティをそのままにして、オブジェクト全体を小さく保つことです。つまり、オブジェクトを文字列としてシリアル化して保存するのではなく、オブジェクトの使用方法全体を変更するのではなく、実際のリストまたはマップとともに小さなハッシュ値を保存しています。

1
user 923227