2014-11-25 15 views
7

Wcześniej w tym roku Amazon announced obsługa filtrów zapytań w atrybutach innych niż kluczowe.AWS DynamoDB - łączenie wielu filtrów zapytań na jednym, nie kluczowym atrybucie w java

Czy warunki można łączyć na jednej wartości atrybutu? Na przykład w tym scenariuszu chciałbym pobrać wszystkie elementy, które nie pasują do pewnej listy wartości w pojedynczej kolumnie "bez klucza".

Ich dokumentacja stwierdza, że ​​każdy warunek może zawierać tylko jedną wartość atrybutu dla porównań, takich jak NOT_EQUALS lub BEGINS_WITH. W związku z tym następuje nie działa:

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); 

Wygląda na to tylko operatora IN porównania może zawierać listę wartości atrybutów. Idealnie te warunki powinny być przenośne? Ponieważ filtr zapytania znajduje się mapa hash nie możemy umieścić wiele warunków na tej samej kolumnie (próbowałem):

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); 

Każda pomoc lub wyjaśnienie byłoby bardzo mile widziane!

Dzięki

Odpowiedz

14

Więc okazuje się to możliwe dzięki dodaniu FilterExpression do zapytania (wprowadzone niedawno w tym blog post)

widziałem to w DynamoDB documentation ale nie uaktualniony do najnowszej AWS Java SDK :(

Korzystanie mój powyższy przykład to będzie wyglądać:

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); 

Dzięki AW S Wsparcie!

+0

Dziękujemy za poświęcenie czasu na opublikowanie odpowiedzi na swoje pytanie –