Bird
Raised Fist0
DynamoDBquery~5 mins

Filter expressions in DynamoDB

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Filter expressions help you pick only the items you want from a database query or scan. They act like a sieve, letting through just the data that matches your rules.

When you want to find all products cheaper than $20 in a store's inventory.
When you need to get all users who signed up after a certain date.
When you want to list all orders with status 'shipped'.
When you want to scan a table but only keep items with a specific attribute value.
Syntax
DynamoDB
FilterExpression = "attribute_name operator :value"
ExpressionAttributeValues = {":value": {"S"|"N"|"BOOL"|... : value}}

Example:
FilterExpression = "Price < :maxPrice"
ExpressionAttributeValues = {":maxPrice": {"N": "20"}}

Filter expressions are used with Scan or Query operations in DynamoDB.

They do not reduce the read capacity used; they filter results after reading.

Examples
Find items where the Price attribute is less than 20.
DynamoDB
FilterExpression = "Price < :maxPrice"
ExpressionAttributeValues = {":maxPrice": {"N": "20"}}
Find items where the Category attribute contains the word 'Books'.
DynamoDB
FilterExpression = "contains(Category, :cat)"
ExpressionAttributeValues = {":cat": {"S": "Books"}}
Find items where the Status attribute equals 'shipped'.
DynamoDB
FilterExpression = "Status = :status"
ExpressionAttributeValues = {":status": {"S": "shipped"}}
Sample Program

This command scans the 'Products' table and returns only items where the Price is less than 20. It shows the ProductId and Price for each matching item.

DynamoDB
aws dynamodb scan \
  --table-name Products \
  --filter-expression "Price < :maxPrice" \
  --expression-attribute-values '{":maxPrice":{"N":"20"}}' \
  --projection-expression "ProductId, Price"
OutputSuccess
Important Notes

Filter expressions only filter results after DynamoDB reads the data, so they do not reduce read capacity usage.

Use ExpressionAttributeValues to safely pass values and avoid injection issues.

You can combine multiple conditions using AND, OR, and parentheses in filter expressions.

Summary

Filter expressions help you get only the data you want from a scan or query.

They use simple conditions on attributes like equals, less than, or contains.

Remember, filtering happens after reading, so it does not save read capacity.

Practice

(1/5)
1. What is the main purpose of a FilterExpression in a DynamoDB scan or query?
easy
A. To return only items that meet specific conditions after reading all data
B. To reduce the size of the table permanently
C. To speed up the write operations
D. To create new indexes automatically

Solution

  1. Step 1: Understand what FilterExpression does

    A FilterExpression is used to specify conditions that items must meet to be returned after the scan or query reads the data.
  2. Step 2: Differentiate from other operations

    It does not change the table or speed up writes; it only filters results after reading.
  3. Final Answer:

    To return only items that meet specific conditions after reading all data -> Option A
  4. Quick Check:

    FilterExpression filters results after reading [OK]
Hint: FilterExpression filters results after reading data [OK]
Common Mistakes:
  • Thinking FilterExpression reduces read capacity usage
  • Confusing FilterExpression with key condition
  • Assuming it changes the table data
2. Which of the following is the correct syntax for a FilterExpression to find items where attribute status equals 'active' in DynamoDB?
easy
A. FilterExpression: "status = 'active'"
B. FilterExpression: "status == 'active'"
C. FilterExpression: "status equals 'active'"
D. FilterExpression: "status === 'active'"

Solution

  1. Step 1: Recall DynamoDB FilterExpression syntax

    DynamoDB uses single equals sign (=) for equality in FilterExpressions.
  2. Step 2: Check each option

    FilterExpression: "status = 'active'" uses correct syntax. The other options use invalid operators (==, equals, ===) or keywords.
  3. Final Answer:

    FilterExpression: "status = 'active'" -> Option A
  4. Quick Check:

    Use single equals (=) for equality in FilterExpression [OK]
Hint: Use single '=' for equality in FilterExpression [OK]
Common Mistakes:
  • Using double or triple equals (==, ===)
  • Writing 'equals' as a word
  • Using incorrect operators
3. Given a DynamoDB table with items having attribute age, what will be the result of this scan with FilterExpression age < 30 if the table has ages 25, 30, 35, and 40?
medium
A. Items with ages 25 and 30
B. Items with ages 25 only
C. Items with ages 30, 35, and 40
D. Items with ages 35 and 40

Solution

  1. Step 1: Understand the FilterExpression condition

    The condition is age < 30, meaning only items with age less than 30 pass the filter.
  2. Step 2: Check which ages satisfy the condition

    From the list (25, 30, 35, 40), only 25 is less than 30.
  3. Final Answer:

    Items with ages 25 only -> Option B
  4. Quick Check:

    age < 30 means less than 30 [OK]
Hint: Remember < means strictly less than [OK]
Common Mistakes:
  • Including age 30 when condition is less than 30
  • Confusing < with <= operator
  • Assuming filter changes data in table
4. You wrote this FilterExpression: contains(name, 'John') but it returns no results even though some items have 'John' in their name. What is the likely mistake?
medium
A. Using contains() instead of equals()
B. Not using ExpressionAttributeNames for reserved words
C. FilterExpression is case-sensitive and 'John' does not match 'john'
D. FilterExpression must be in uppercase

Solution

  1. Step 1: Understand contains() behavior

    contains() checks if the attribute contains the exact substring, including case.
  2. Step 2: Consider case sensitivity

    If the data has 'john' lowercase but the filter uses 'John' with uppercase J, no match occurs.
  3. Step 3: Check other choices

    Using equals() instead of contains() is not the issue since contains() is appropriate for substrings; reserved words would cause a different error; FilterExpressions are not required to be uppercase.
  4. Final Answer:

    FilterExpression is case-sensitive and 'John' does not match 'john' -> Option C
  5. Quick Check:

    contains() is case-sensitive [OK]
Hint: Remember contains() is case-sensitive [OK]
Common Mistakes:
  • Ignoring case sensitivity in contains()
  • Not using ExpressionAttributeNames when needed
  • Assuming contains() works like equals()
5. You want to scan a DynamoDB table to find items where score is greater than 50 and status is 'active'. Which FilterExpression correctly applies both conditions?
hard
A. FilterExpression: "score > 50, status = 'active'"
B. FilterExpression: "score > 50 OR status = 'active'"
C. FilterExpression: "score > 50 && status == 'active'"
D. FilterExpression: "score > 50 AND status = 'active'"

Solution

  1. Step 1: Understand logical operators in FilterExpression

    DynamoDB uses uppercase AND and OR for combining conditions.
  2. Step 2: Check each option's syntax

    FilterExpression: "score > 50 AND status = 'active'" uses correct syntax with AND and single equals. FilterExpression: "score > 50 OR status = 'active'" uses OR which is incorrect for both conditions. FilterExpression: "score > 50, status = 'active'" uses comma which is invalid. FilterExpression: "score > 50 && status == 'active'" uses && and double equals which are invalid.
  3. Final Answer:

    FilterExpression: "score > 50 AND status = 'active'" -> Option D
  4. Quick Check:

    Use AND in uppercase and single '=' for equality [OK]
Hint: Use uppercase AND and single '=' in FilterExpression [OK]
Common Mistakes:
  • Using OR instead of AND for both conditions
  • Using commas or && instead of AND
  • Using double equals (==) instead of single equals (=)