web-dev-qa-db-ja.com

Javaを使用したDynamoDBスキャンでの包含フィルターの使用

次のような有効なクエリがあるとします。

ScanRequest scanRequest = new ScanRequest()
            .withTableName("myTable")
            .withFilterExpression("attr1 = :val1 and attr2 = :val2")
            .withExpressionAttributeValues(vm)  //contains values for :val1 and :val2
            .withLimit(PAGE_SIZE)
            .withConsistentRead(READ_TYPE);

次に、このスキャンを拡張したいと思います。私のテーブルにも次の形式の属性attr3があるとします。

"attr3": {
    "S": "AAA BBB CCC DDD"
}

Attr3にAAAが含まれる要素をフィルタリングするにはどうすればよいですか?またはAAAとBBBですか?

12
user3146897

DynamoDB 条件式リファレンスドキュメント はあなたの友達です!

特定のケースでは、contains関数を使用してサブストリングを検索できます。フィルター式は次のようになります。

"attr1 = :val1 and attr2 = :val2 and (contains(attr3, :val3a) or contains(attr3, :val3b))"             
// where :val3a and :val3b are value placeholders for say AAA and BBB

しかし、達成したいことは、サーバー側でDynamoDBフィルターで処理できるよりも少し洗練されていると思われるため、2つのオプションがあります。

  1. アプリケーションロジックでフィルタリングを実行します(つまり、結果をクライアントに送り、そこでフィルタリングします)。
  2. 属性を文字列からリスト、または文字列セットに変更します(重複が許可されていない場合)

どちらの場合でも、フィルターを使用したスキャンは、ネットワーク帯域幅の点で通常のスキャンよりも効率的であることを知っておく必要があります(ほとんどの結果がフィルターによって除外される場合)。ただし、消費される容量の点では、スキャンはフィルターの有無にかかわらず同等に高価です。したがって、それを回避できる場合は、テーブルのスキャンに頼りすぎないでください!

25
Mike Dinescu