+7 votes
12.6k views
in Amazon Web Service by

Suppose I have a working query such as:

ScanRequest scanRequest = new ScanRequest()
            .withTableName("myTable")
            .withFilterExpression("attr1 = :val1 and attr2 = :val2")
            .withExpressionAttributeValues(vm)  //contains values for :val1 and :val2
            .withLimit(PAGE_SIZE)
            .withConsistentRead(READ_TYPE);

Now I would like to extend this scan. Suppose my table also has an attribute attr3 which has the form:

"attr3": {
    "S": "AAA BBB CCC DDD"
}

How can I filter elements who's attr3 contains AAA? Or AAA and BBB?

1 Answer

+13 votes
by

The DynamoDB Condition Expressions Reference documentation is your friend!

In your specific case you can use the contains function to search for a sub-string. Your filter expression might look something like this:

"attr1 = :val1 and attr2 = :val2 and (contains(attr3, :val3a) or contains(attr3, :val3b))"             
// where :val3a and :val3b are value placeholders for say AAA and BBB

But I suspect that what you want to achieve is a bit more sophisticated than can be handled server-side by DynamoDB filters, so you have two options:

  1. do the filtering in the application logic (ie. bring down your results to the client and filter there), or;
  2. change your attribute from a string to a list, or string set (if duplicates not allowed)

In either case, you should know that a scan with filters is only more efficient than a regular scan in terms of network band-with (in the case when most results are excluded by the filter). But in terms of capacity consumed a Scan is equally expensive with or without filters. So if you can avoid it, don't rely on scanning your table too much!

Welcome to Kloudwise, where you can ask any AWS, Azure, GCP and other cloud service questions and receive answers from other members of the community.
...