2014-11-25 13 views
7

All'inizio di quest'anno Amazon announced supporto di filtri di query su attributi non chiave.AWS DynamoDB - combinazione di più filtri di query su un singolo attributo non chiave in java

Le condizioni possono essere combinate su un singolo valore di attributo? Ad esempio, in questo scenario vorrei recuperare tutti gli elementi che non corrispondono ad un certo elenco di valori in una singola colonna 'non chiave'.

La documentazione specifica che ogni condizione può contenere solo un valore di attributo per confronti come NOT_EQUALS o BEGINS_WITH. Di seguito, pertanto non funziona:

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

Sembra che solo l'operatore IN confronto può contenere un elenco di valori di attributo. Idealmente queste condizioni dovrebbero essere concatenate? Dal momento che il filtro di query è una mappa di hash non possiamo mettere più condizioni sulla stessa colonna (ho provato):

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

Qualsiasi aiuto o chiarimento sarebbe molto apprezzato!

Grazie

risposta

14

Quindi Risulta questo è reso possibile con l'aggiunta di un FilterExpression alla query (introdotti di recente in questo blog post)

avevo visto questo nel DynamoDB documentation, ma non avevo aggiornato all'ultima AWS Java SDK :(

Usando il mio esempio precedente questo sarebbe simile:

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

Grazie AW S supporto!

+0

Grazie per aver dedicato del tempo per pubblicare una risposta alla tua domanda –

Problemi correlati