2017-11-30 6 views
1

QuerySpec withKeyConditionExpression 또는 withFilterExpression에 "NOT EQUALS"비교 연산자가없는 것처럼 보입니다. 나는 다음과 같이하려고 노력하고있다.DynamoDB Java SDK NOT EQUALS를 사용하여 문자열 필드에서 쿼리하는 방법

new QuerySpec() 
    .withKeyConditionExpression("#name <> :var_name AND #date > :var_date") 
    .withNameMap(new NameMap() 
     .with("#name", "name") 
     .with("#date", "date")) 
    .withValueMap(new ValueMap() 
     .withString(":var_name","Unknown") 
     .withString(":var_date", thirtyDaysAgo)); 

여기서 name은 "Unknown"문자열과 같지 않다. > <

이 (쿼리에서 조건을 제외하고 메모리에 결과를 통해 반복이 아닌)이 주위에 방법이 있나요

:

는, 나는 KeyConditionExpress에서 사용되는 "잘못된 연산자를 얻을.? 나는 동일하지 연산자를 참조하는 다음 문서를 찾았지만 그것은 쿼리 필터에 사용할 수없는 것 같습니다.

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

Making Comparisons 

Use these comparators to compare an operand against a range of values, or an enumerated list of values: 

a = b — true if a is equal to b 
a <> b — true if a is not equal to b 
a < b — true if a is less than b 
a <= b — true if a is less than or equal to b 
a > b — true if a is greater than b 
a >= b — true if a is greater than or equal to b 
For a Query operation, Condition is used for specifying the KeyConditions to use when querying a table or an index. For KeyConditions, only the following comparison operators are supported: 

EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN 

Condition is also used in a QueryFilter, which evaluates the query results and returns only the desired values. 

NE : Not equal. NE is supported for all data types, including lists and maps. 

AttributeValueList can contain only one AttributeValue of type String, Number, Binary, String Set, Number Set, or Binary Set. If an item contains an AttributeValue of a different type than the one provided in the request, the value does not match. For example, {"S":"6"} does not equal {"N":"6"}. Also, {"N":"6"} does not equal {"NS":["6", "2", "1"]}. 

답변

0

당신이 KeyConditionExpression를 사용하는 경우

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Condition.html

, 당신은 하나의 파티션 키를 지정해야합니다.

에서 [KeyConditionExpression 상기 분할 키 어떤지 검사가 필요한

단일 파티션 키 값의 동일성 테스트를 수행하며, 다음과 같은 형식으로 지정해야 조건 :

Documentation는 다음이 포함

partitionKeyName = partitionkeyval

는 여전히 쿼리를 할 오히려 '쿼리'보다 Scan 작업을 사용할 수 있습니다. 기본적으로 Scan은 테이블의 모든 항목을 반환하므로 필터 식에서 연산자를 사용합니다.

편집 :

Map<String, String> attributeNames = new HashMap<String, String >(); 
attributeNames.put("#name", "name"); 
attributeNames.put("#date", "date"); 

Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>(); 
attributeValues.put(":var_date", new AttributeValue().withN(thirtyDaysAgo)); 
attributeValues.put(":var_name", new AttributeValue().withS("Unknown")); 

ScanRequest scanRequest = new ScanRequest() 
     .withTableName(TABLE_NAME) 
     .withFilterExpression("#name <> :var_name AND #date > :var_date") 
     .withExpressionAttributeNames(attributeNames) 
     .withExpressionAttributeValues(attributeValues) 
+1

좋아, 내 초기 문제는 내가 연산자를 같지 않음 사용할 수있는 방법을 찾기 위해 노력하고 있다고했다. 스캔 내에서 가능합니까? 또는 아마 필터 식에서? – Brooks

+0

스캔 요청은 테이블의 모든 항목을 반환합니다. 그러면 필터 식에서 연산자를 사용하여 응용 프로그램이 언제 되돌아 오는지 제한 할 수 있습니다. 몇 가지 예제 코드를 게시했습니다. 테스트하기에 편리한 환경이 아니지만 시작해야합니다. – Stu