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