Bird
Raised Fist0
DynamoDBquery~10 mins

Scan with filter expressions in DynamoDB - Step-by-Step Execution

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
Concept Flow - Scan with filter expressions
Start Scan
Read all items
Apply Filter Expression
Yes No
Keep
Return filtered items
End
Scan reads all items, then filter expression keeps only matching items before returning.
Execution Sample
DynamoDB
Scan table 'Books' with filter: Author = 'Alice'
Return only items where Author is 'Alice'
This scan reads all books but returns only those written by Alice.
Execution Table
StepItem ReadFilter Condition (Author='Alice')ResultAction
1{"Title":"Book1","Author":"Alice"}TrueKeepAdd to result
2{"Title":"Book2","Author":"Bob"}FalseDiscardSkip
3{"Title":"Book3","Author":"Alice"}TrueKeepAdd to result
4{"Title":"Book4","Author":"Carol"}FalseDiscardSkip
5{"Title":"Book5","Author":"Alice"}TrueKeepAdd to result
End---All items scanned, filtered results returned
💡 All items scanned; only items with Author='Alice' kept
Variable Tracker
VariableStartAfter 1After 2After 3After 4After 5Final
Current ItemNone{"Title":"Book1","Author":"Alice"}{"Title":"Book2","Author":"Bob"}{"Title":"Book3","Author":"Alice"}{"Title":"Book4","Author":"Carol"}{"Title":"Book5","Author":"Alice"}None
Result Set[][Book1][Book1][Book1, Book3][Book1, Book3][Book1, Book3, Book5][Book1, Book3, Book5]
Key Moments - 3 Insights
Why does the scan read all items even if we only want some?
Scan reads every item first because filter expressions are applied after reading all items, as shown in execution_table rows 1-5.
Does the filter expression reduce read capacity usage?
No, filter expressions do not reduce read capacity because all items are read first; filtering happens after, as seen in the 'Action' column.
What happens to items that do not match the filter?
Items not matching the filter are discarded and not added to the result set, as shown in rows 2 and 4 of execution_table.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what happens at step 3?
AItem is kept because Author is Alice
BItem is discarded because Author is not Alice
CScan stops at this step
DFilter expression is not applied
💡 Hint
Check the 'Filter Condition' and 'Result' columns at step 3 in execution_table
At which step does the filter expression first discard an item?
AStep 1
BStep 4
CStep 2
DStep 5
💡 Hint
Look for the first 'Discard' in the 'Result' column in execution_table
If the filter was changed to Author='Bob', how would the result set change after step 5?
AResult set would include Book1, Book3, and Book5
BResult set would include only Book2
CResult set would be empty
DResult set would include all books
💡 Hint
Refer to variable_tracker 'Result Set' and which items have Author='Bob'
Concept Snapshot
Scan reads all items in a table.
Filter expressions apply after reading.
Only items matching filter are returned.
Filter does not reduce read cost.
Useful for simple filtering without indexes.
Full Transcript
In DynamoDB, a scan operation reads every item in a table. After reading, it applies a filter expression to decide which items to keep. Items that match the filter are included in the results; others are discarded. This means the scan reads all data first, so filter expressions do not reduce the amount of data read or the read capacity used. For example, scanning a 'Books' table with filter Author='Alice' reads all books but returns only those by Alice. This process is shown step-by-step in the execution table and variable tracker, helping beginners see how each item is processed and filtered.

Practice

(1/5)
1. What does a Scan operation with a filter expression do in DynamoDB?
easy
A. It deletes items that do not match the filter condition.
B. It reads only the items that match the filter condition directly.
C. It updates items that match the filter condition.
D. It reads all items but returns only those matching the filter condition.

Solution

  1. Step 1: Understand Scan operation

    A Scan reads every item in the table regardless of any condition.
  2. Step 2: Apply filter expression effect

    The filter expression is applied after reading all items, so only matching items are returned.
  3. Final Answer:

    It reads all items but returns only those matching the filter condition. -> Option D
  4. Quick Check:

    Scan + filter = read all, return filtered [OK]
Hint: Scan reads all, filter returns matching items only [OK]
Common Mistakes:
  • Thinking Scan reads only filtered items
  • Confusing Scan with Query
  • Assuming filter modifies data
2. Which of the following is the correct syntax to use a filter expression in a DynamoDB Scan operation?
easy
A. scan(TableName='MyTable', Filter='Name = "John"')
B. scan(TableName='MyTable', ConditionExpression='Name = "John"')
C. scan(TableName='MyTable', FilterExpression='attribute_exists(Name)')
D. scan(TableName='MyTable', FilterCondition='Name = "John"')

Solution

  1. Step 1: Identify correct parameter name

    The correct parameter for filtering in Scan is FilterExpression.
  2. Step 2: Check syntax correctness

    scan(TableName='MyTable', FilterExpression='attribute_exists(Name)') uses FilterExpression with a valid condition attribute_exists(Name).
  3. Final Answer:

    scan(TableName='MyTable', FilterExpression='attribute_exists(Name)') -> Option C
  4. Quick Check:

    FilterExpression is correct parameter [OK]
Hint: Use FilterExpression parameter for scan filters [OK]
Common Mistakes:
  • Using ConditionExpression instead of FilterExpression
  • Using Filter or FilterCondition which are invalid
  • Incorrect syntax for filter condition
3. Given a DynamoDB table with items: [{"Name": "Alice", "Age": 30}, {"Name": "Bob", "Age": 25}, {"Name": "Carol", "Age": 35}], what will be the result of a Scan with filter expression Age > 30?
medium
A. [{"Name": "Alice", "Age": 30}]
B. [{"Name": "Carol", "Age": 35}]
C. [{"Name": "Bob", "Age": 25}]
D. [{"Name": "Alice", "Age": 30}, {"Name": "Carol", "Age": 35}]

Solution

  1. Step 1: Understand filter condition

    The filter expression Age > 30 means only items with Age greater than 30 are returned.
  2. Step 2: Check each item against condition

    Alice has Age 30 (not greater), Bob 25 (not greater), Carol 35 (greater). Only Carol matches.
  3. Final Answer:

    [{"Name": "Carol", "Age": 35}] -> Option B
  4. Quick Check:

    Age > 30 returns Carol only [OK]
Hint: Filter returns only items strictly matching condition [OK]
Common Mistakes:
  • Including items with Age equal to 30
  • Confusing greater than with greater or equal
  • Returning all items ignoring filter
4. You wrote this Scan code with filter expression: FilterExpression='Age > :val' and ExpressionAttributeValues={':val': 30}, but it returns no items. What is the likely error?
medium
A. ExpressionAttributeValues must be a dictionary with DynamoDB types, e.g., {':val': {'N': '30'}}.
B. FilterExpression should use '>' not '>'.
C. ExpressionAttributeValues key should be ':val' as a string, not a number.
D. Scan does not support FilterExpression.

Solution

  1. Step 1: Check ExpressionAttributeValues format

    DynamoDB expects attribute values in a typed format, e.g., numbers as {'N': '30'}.
  2. Step 2: Identify why no items returned

    Providing raw number 30 instead of typed value causes filter to fail matching any item.
  3. Final Answer:

    ExpressionAttributeValues must be a dictionary with DynamoDB types, e.g., {':val': {'N': '30'}}. -> Option A
  4. Quick Check:

    Use typed values in ExpressionAttributeValues [OK]
Hint: Use DynamoDB typed values in ExpressionAttributeValues [OK]
Common Mistakes:
  • Passing raw Python values instead of typed dict
  • Using HTML entities like > in code instead of >
  • Thinking Scan does not support filters
5. You want to scan a DynamoDB table to find items where Status is 'Active' and Score is greater than 80. Which filter expression and attribute values are correct?
hard
A. FilterExpression='Status = :s AND Score > :sc', ExpressionAttributeValues={':s': {'S': 'Active'}, ':sc': {'N': '80'}}
B. FilterExpression='Status == :s AND Score > :sc', ExpressionAttributeValues={':s': 'Active', ':sc': 80}
C. FilterExpression='Status = :s OR Score > :sc', ExpressionAttributeValues={':s': {'S': 'Active'}, ':sc': {'N': '80'}}
D. FilterExpression='Status = :s AND Score > :sc', ExpressionAttributeValues={':s': 'Active', ':sc': '80'}

Solution

  1. Step 1: Check filter expression logic

    The condition requires both Status equals 'Active' AND Score greater than 80, so use 'AND' and '=' operators correctly.
  2. Step 2: Verify ExpressionAttributeValues format

    Values must be typed: strings as {'S': 'Active'} and numbers as {'N': '80'}.
  3. Final Answer:

    FilterExpression='Status = :s AND Score > :sc', ExpressionAttributeValues={':s': {'S': 'Active'}, ':sc': {'N': '80'}} -> Option A
  4. Quick Check:

    Correct logic and typed values [OK]
Hint: Use AND and typed values for multiple conditions [OK]
Common Mistakes:
  • Using '==' instead of '=' in filter expression
  • Using OR instead of AND
  • Passing untyped values in ExpressionAttributeValues