ブール値またはSQLのような条件でdynamodbテーブルをクエリしたいです。 Get me all the items where attribute1 = "no" or attribute2="no"
scanRequest.withScanFilter
で試しましたが、すべての条件はブールANDを実行することによって実行されます。ブールORingを実行するにはどうすればよいですか。
ScanRequestのConditionalOperatorを「OR」に設定できます。デフォルト値は「AND」です
http://docs.aws.Amazon.com/amazondynamodb/latest/APIReference/API_Scan.html
ScanRequest scanRequest = new ScanRequest("tableName");
scanRequest.setConditionalOperator(ConditionalOperator.OR);
Map<String, Condition> scanFilter = new HashMap<String, Condition>();
scanFilter.put("attribute1", new Condition().withAttributeValueList(new AttributeValue("no")).withComparisonOperator(ComparisonOperator.EQ));
scanFilter.put("attribute2", new Condition().withAttributeValueList(new AttributeValue("no")).withComparisonOperator(ComparisonOperator.EQ));
scanRequest.setScanFilter(scanFilter);
ScanResult scanResult = dynamo.scan(scanRequest);
for(Map<String, AttributeValue> item : scanResult.getItems()) {
System.out.println(item);
}
HashKey
値を知っている場合、別のオプションはQUERYとFilterExpressionを使用することです。 Java SDKの例を次に示します:
Table table = dynamoDB.getTable(tableName);
Map<String, Object> expressionAttributeValues = new HashMap<String, Object>();
expressionAttributeValues.put(":x", "no");
expressionAttributeValues.put(":y", "no");
QuerySpec spec = new QuerySpec()
.withHashKey("HashKeyAttributeName", "HashKeyValueHere")
.withFilterExpression("attribute1 = :x or attribute2 = :y")
.withValueMap(expressionAttributeValues);
ItemCollection<QueryOutcome> items = table.query(spec);
Iterator<Item> iterator = items.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toJSONPretty());
}
詳細については、 条件式による条件の指定 を参照してください。
FilterExpressionで角かっこを使用することもできます。
const params = { TableName: process.env.PROJECTS_TABLE, IndexName: 'teamId-createdAt-index', KeyConditionExpression: 'teamId = :teamId', ExpressionAttributeValues: { ':teamId': verifiedJwt.teamId, ':userId': verifiedJwt.userId, ':provider': verifiedJwt.provider }, FilterExpression: 'attribute_exists(isNotDeleted) and ((attribute_not_exists(isPrivate)) or (attribute_exists(isPrivate) and userId = :userId and provider = :provider))' };