i have database like this :
Symbol are primaryKey and priceId is SortKey and others are attributes priceId as sortkey always unique
i have information only symbol and savetime
for example is
String Symbols = "EURUSD"; String time = "2020-06-10 09:12:07";
i have try use scan but my code stack
Table table = dynamoDB.getTable(tableName);
System.out.println("runFirstTime For Search Data");
String Symbols = "EURUSD";
String time = "2020-06-10 09:12:07";
try{
Map<String, AttributeValue> expressionAttributeValues = new HashMap<String, AttributeValue>();
expressionAttributeValues.put(":savetime", new AttributeValue().withS(time));
expressionAttributeValues.put(":symbol", new AttributeValue().withS(Symbols));
ScanRequest scanRequest = new ScanRequest().withTableName(tableName).withFilterExpression("savetime = :savetime AND symbol = :symbol")
.withProjectionExpression("symbol, priceId, savetime, Price").withExpressionAttributeValues(expressionAttributeValues);
ScanResult result = client.scan(scanRequest);
for (Map<String, AttributeValue> item : result.getItems()) {
System.out.println(item);
}
}catch (Exception e) {
System.err.println("Cannot retrieve items.");
System.err.println(e.getMessage());
}
}
my code stack in log4j:WARN No appenders could be found for logger
(com.amazonaws.AmazonWebServiceClient).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
runFirstTime For Search Data
i also have try use query and change my database structure like this
and i have try to code use this
Table table = dynamoDB.getTable(tableName);
System.out.println("runFirstTime For Search Data");
String Symbols = "EURUSD";
String time = "2020-06-10 11:43:31";
String Prefix = "Onezero";
ItemCollection<QueryOutcome> items = null;
Iterator<Item> iterator = null;
Item item = null;
try{
QuerySpec spec = new QuerySpec().withProjectionExpression("symbol, priceId, Price, savetime")
.withKeyConditionExpression("symbol = :v_symbol and begin_with(priceId, :begin)")
.withFilterExpression("savetime = :v_savetime")
.withValueMap(new ValueMap()
.withString(":v_symbol", Symbols)
.withString("begin", Prefix)
.withString(":v_savetime", time));
items = table.query(spec);
iterator = items.iterator();
while (iterator.hasNext()) {
item = iterator.next();
System.out.println(item.getString("symbol") + ": " + item.getString("savetime") + ": "+ item.getString("Price"));
}
}catch (Exception e) {
System.err.println("Cannot retrieve items.");
System.err.println(e.getMessage());
}
}
but i still got an error like this one
ExpressionAttributeValues contains invalid key: Syntax error; key: "begin" (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 5TTRE1Q7FBT5TLNL0MTTPV05K7VV4KQNSO5AEMVJF66Q9ASUAAJG; Proxy: null)
why like that ? maybe error in scan. so what is best to use to search from 1 key and 1 attribute use dynamoDb ? any example for that ?
i have try use getitem or scan but still have problem