2014-11-25 8 views
7

Anfang dieses Jahres Amazon announced Unterstützung von Abfrage-Filter für Nicht-Schlüsselattribute.AWS DynamoDB - Kombinieren mehrerer Abfragefilter für ein einzelnes Nicht-Schlüsselattribut in Java

Können Bedingungen für einen einzelnen Attributwert kombiniert werden? In diesem Szenario möchte ich beispielsweise alle Elemente abrufen, die nicht mit einer bestimmten Werteliste in einer einzelnen Nicht-Schlüssel-Spalte übereinstimmen.

Ihre Dokumentation besagt, dass jede Bedingung nur einen Attributwert für Vergleiche wie NOT_EQUALS oder BEGINS_WITH enthalten kann. Im Folgenden daher nicht funktioniert:

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

Es sieht aus wie nur der IN Vergleichsoperator eine Liste von Attributwerten halten kann. Idealerweise sollten diese Bedingungen kettenfähig sein? Da die Abfragefilter eine Hash-Karte ist, können wir nicht mehrere Bedingungen auf der gleichen Spalte setzen (ich habe versucht):

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

Hilfe oder Klärung wäre sehr dankbar!

Dank

Antwort

14

So stellt sich heraus, das durch Hinzufügen einer Filterexpression auf die Abfrage ermöglicht wird (vor kurzem in diesem blog post)

ich dies in der DynamoDB documentation gesehen hatte, aber nicht beschränkt auf die neuesten AWS Upgrade Java SDK :(

meine obigen Beispiel verwenden würde dies wie folgt aussehen:

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

Dank AW S Unterstützung!

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, eine Antwort auf Ihre Frage zu schreiben –