2017-02-03 2 views
0

MongoDBからDynamoDBへのデータストアの移行は、十分に確立されたAWSサービスであるため評価しています。DynamoDBのドキュメント間でのクエリのサポート

しかし、DynamoDBのデータモデルが私たちのユースケースをサポートするのに十分な堅牢性を持っているかどうかはわかりません。私はDynamoDBが2014年に文書サポートを追加したことを理解していますが、私が見てきた例では、文書全体で動作し、パーティションキーの値を指定しないクエリに対処するようには見えません。例えば

私は、従業員情報、 含む文書がある場合は、{ "名前": "ジョン・ドウ"、 "部門": "売上"、 "date_of_joining": "2017年1月21日" を}

と私は01-01-2016の後に参加したすべての従業員を私に渡すようなクエリを作成する必要があります。このスキーマでは作成できません。 ランダムに生成されたパーティションキー(たとえば0-99)を持つセカンダリインデックスを作成し、 "date_of_joining"にソートキーを作成した後、 "date_of_joining"のすべてのパーティションと条件をクエリした後で、 。しかしこれは簡単なクエリを実行するには複雑すぎるので、MongoDBでこれを行うのは非常に簡単です。

DynamoDBでこのようなクエリを実行するより良い方法があり、DynamoDBがそのような使用例に本当に適しているかどうかを理解できる人がいますか?

+0

類似したものhttp://stackoverflow.com/a/34961036/2811189 –

答えて

1

実際、GSIのパーティションキーは一意である必要はありません。 GSIのパーティションキーとしてdate_of_joiningを使用できます。

ただし、パーティションキーを照会するときに、パーティションキーフィールドにgreater thanを使用することはできません。パーティションキーには等価のみがサポートされています。 GSIのパーティションキーとして乱数を使用したい理由と、date_of_joiningをソートキーとして使用する理由がわかりません。あなたのように設計しても、私は期待どおりの結果を得るためにDynamoDB Query APIを使用することはできません。 DynamoDBでコストのかかる操作であるDynamoDB Scan APIを使用すると、最終的に終了することがあります。

GSI:クエリAPIでサポート

date_of_joining - as Partition key 

: -

あなたが同じDOJのために複数のアイテムを持っている場合は、GSIを使用してクエリを実行する場合、との結果が複数の項目(すなわちを持っています)。

KeyConditionExpression : 'date_of_joining = :doj' 

クエリAPIでサポートされていません: -

KeyConditionExpression : 'date_of_joining > :doj' 

結論: -

あなたはDynamoDBのスキャンを使用する必要があります。スキャンを使用する場合は、GSIが必要ない場合があります。 FilterExpressionを使用してメインテーブルを直接スキャンすることができます。

FilterExpression : 'date_of_joining > :doj' 

欠点: -

  • 高価な

  • 効率的ではありません

+0

返信いただきありがとうございます。私が0-99の数値を持つ列を追加するのは、クエリでパーティションキーの値が必要なため、値(0-99)を指定できるからです。クエリを100回実行する必要がありますが、処理はクラスタ全体に分散しています。 ソートキーとして 'date_of_joining'を作成すると、その上にクエリー以上のクエリーを作成することができます。そうでない場合は教えてください。 – Ashish

+0

また、DynamoDBではスキャンが適切でない理由はありません – Ashish

+0

スキャンはコストに直接関連する読み取り容量を浪費するため、適切なオプションではありません。テーブル内のすべての項目を読み込んでからフィルタ条件を適用して結果を生成する必要があるため、効率的ではありません。テーブルに100,000アイテムがある場合のパフォーマンスとコストについて考えてみましょう。 – notionquest

0

あなたは、インデックスのバックエンドを使用して、範囲クエリをサポートすることを決定するかもしれません。たとえば、Lambda関数を使用してDynamoDBでテーブルの更新をAWS ElasticSearchにストリーミングし、選択した結合日の範囲に一致するレコードをESにクエリできます。

+0

ありがとうアレクサンダー。今は非常に多くのデータベースですでに失われているため、1つのワークロードに対して2つのデータベースを追加する必要はありません。 – Ashish

関連する問題