web-dev-qa-db-ja.com

AWSDynamoDB-java)の単一の非キー属性で複数のクエリフィルターを組み合わせる

今年の初めにAmazon 発表済み 非キー属性でのクエリフィルターのサポート。

条件を単一の属性値に組み合わせることができますか?たとえば、このシナリオでは、単一の「非キー」列の特定の値のリストに一致しないすべてのアイテムを取得したいと思います。

彼らのドキュメントには、各条件がNOT_EQUALSBEGINS_WITHのような比較のために1つの属性値しか保持できないと記載されています。したがって、以下は機能しません。

HashMap<String, Condition> queryFilter = new HashMap<String, Condition>();

List<AttributeValue> AttributeValues = new ArrayList<AttributeValue>();
AttributeValues.add(new AttributeValue().withS("someValue1"));
AttributeValues.add(new AttributeValue().withS("someValue2"));

Condition attributeCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.NE)
    .withAttributeValueList(AttributeValues);

queryFilter.put("COLUMN_1", attributeCondition);

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
    .withHashKeyValues(itemKey)
    .withQueryFilter(queryFilter)
    .withLimit(pPageSize);

IN比較演算子のみが属性値のリストを保持できるようです。理想的には、これらの条件は連鎖可能である必要がありますか?クエリフィルターはハッシュマップであるため、同じ列に複数の条件を設定することはできません(私が試しました)。

Condition c1 = new Condition()
    .withAttributeValueList(new AttributeValue().withS("someValue1"))
    .withComparisonOperator(ComparisonOperator.NE);

Condition c2 = new Condition()
    .withAttributeValueList(new AttributeValue().withS("someValue2"))
    .withComparisonOperator(ComparisonOperator.NE);

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
    .withHashKeyValues(itemKey)
    .withConditionalOperator(ConditionalOperator.AND)
    .withQueryFilterEntry("COLUMN_1", c1)
    .withQueryFilterEntry("COLUMN_1", c2)
    .withLimit(pPageSize);

どんな助けや説明も大歓迎です!

ありがとう

10
ben.bourdin

したがって、これはクエリにFilterExpressionを追加することで可能になります(最近この記事で紹介されました ブログ投稿

これは DynamoDBドキュメント で見たことがありますが、最新のAWS Java SDK :(

上記の例を使用すると、これは次のようになります。

Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
expressionAttributeValues.put(":val1", new AttributeValue().withS("someValue1"));
expressionAttributeValues.put(":val2", new AttributeValue().withS("someValue2"));

DynamoDBQueryExpression<Item> queryExpression = new DynamoDBQueryExpression<Item>()
    .withHashKeyValues(itemKey)
    .withFilterExpression("COLUMN_1 <> :val1 AND COLUMN_1 <> :val2")
    .withExpressionAttributeValues(expressionAttributeValues)
    .withLimit(pPageSize);

AWSサポートに感謝します!

18
ben.bourdin