web-dev-qa-db-ja.com

DynamoDBで複数のハッシュキーをクエリする方法はありますか?

AmazonのAWS SDK for Javaで単一のクエリを使用して複数のハッシュキーをクエリする方法はありますか?

これが私の問題です。プロジェクトステータスのDBテーブルがあります。ハッシュキーは、プロジェクトのステータスです(つまり、新規、割り当て済み、処理中、または完了)。範囲キーはプロジェクトIDのセットです。現在、「割り当て済み」のステータス(ハッシュ)としてリストされているすべてのプロジェクトを検索するクエリ設定と、「処理中」のステータスを検索する別のクエリセットがあります。検索する必要があるステータスごとに複数のクエリを送信するのではなく、単一のクエリを使用してこれを行う方法はありますか?以下のコード:

    DynamoDBMapper mapper = new DynamoDBMapper(new AmazonDynamoDBClient(credentials));
    PStatus assignedStatus = new PStatus();
    assignedStatus.setStatus("assigned");
    PStatus processStatus = new PStatus();
    processStatus.setStatus("processing");

    DynamoDBQueryExpression<PStatus> queryAssigned = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(assignedStatus);
    DynamoDBQueryExpression<PStatus> queryProcessing = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(processStatus);

    List<PStatus> assigned = mapper.query(PStatus.class, queryAssigned);
    List<PStatus> process = mapper.query(PStatus.class, queryProcessing);

基本的に、queryAssigned変数とassigned変数を削除して、assignedStatusprocessStatusの両方を同じクエリで処理できるかどうかを知りたいのですが、 process、新規または完成していないプロジェクトを検索します。

15
DGolberg

いいえ、現在のところ、同じリクエストで複数のクエリを送信する方法はありません。レイテンシが気になる場合は、異なるスレッドで同時に複数のリクエストを行うことができます。これには、Dynamoが提供した場合の「デュアルクエリ」と同じ量のネットワーク帯域幅が必要です(数百ではなく2を作成していると想定)。

9
Cory Kendall

複数のハッシュキーでクエリを実行する方法はありませんが、2014年4月以降、QueryFilterを使用して、ハッシュキーフィールドに加えて非キーフィールドでフィルタリングすることができます。

AWSは2014年4月24日のブログ投稿で、「QueryFilter」オプションのリリースを発表しました。

本日のリリースでは、このモデルを拡張して非キー属性のクエリフィルタリングをサポートします。 QueryFilterをQuery関数の呼び出しの一部として含めることができるようになりました。フィルターは、キーベースの取得後、結果が返される前に適用されます。この方法でフィルタリングすると、アプリケーションに返されるデータの量を減らしながら、コードを簡素化および合理化できます。

これをチェックしてみてください http://aws.Amazon.com/blogs/aws/improved-queries-and-updates-for-dynamodb/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+AmazonWebServicesBlog+%28Amazon+Web+ Services + Blog%29

5
Aybat

これをC#で試してください。 Javaでも同様だと思います。 serId haskキーです。

        var table = Table.LoadTable(DynamoClient, "YourTableName");
        var batchGet = table.CreateBatchGet();
        batchGet.AddKey(new Dictionary<string, DynamoDBEntry>() { { "UserId", 123 } });
        batchGet.AddKey(new Dictionary<string, DynamoDBEntry>() { { "UserId", 456 } });
        batchGet.Execute();
        var results = batchGet.Results;
0
deverton