Bird
Raised Fist0
DynamoDBquery~10 mins

Query result ordering (ascending, descending) in DynamoDB - Interactive Code Practice

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
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to query items in ascending order by sort key.

DynamoDB
response = table.query(
    KeyConditionExpression=Key('UserId').eq('123'),
    ScanIndexForward=[1]
)
Drag options to blanks, or click blank then click option'
ATrue
BFalse
C'ASC'
D'DESC'
Attempts:
3 left
💡 Hint
Common Mistakes
Using False instead of True for ascending order.
Using string values like 'ASC' which are invalid.
2fill in blank
medium

Complete the code to query items in descending order by sort key.

DynamoDB
response = table.query(
    KeyConditionExpression=Key('UserId').eq('456'),
    ScanIndexForward=[1]
)
Drag options to blanks, or click blank then click option'
A'ASC'
BFalse
CTrue
D'DESC'
Attempts:
3 left
💡 Hint
Common Mistakes
Using True instead of False for descending order.
Using string values like 'DESC' which are invalid.
3fill in blank
hard

Fix the error in the query to order results ascending by sort key.

DynamoDB
response = table.query(
    KeyConditionExpression=Key('UserId').eq('789'),
    ScanIndexForward=[1]
)
Drag options to blanks, or click blank then click option'
A'True'
B'False'
CFalse
DTrue
Attempts:
3 left
💡 Hint
Common Mistakes
Using string 'True' or 'False' instead of boolean True or False.
Confusing ascending and descending values.
4fill in blank
hard

Fill both blanks to query items for UserId '101' in descending order.

DynamoDB
response = table.query(
    KeyConditionExpression=Key([1]).eq([2]),
    ScanIndexForward=False
)
Drag options to blanks, or click blank then click option'
A'UserId'
B'101'
C'SortKey'
D'202'
Attempts:
3 left
💡 Hint
Common Mistakes
Using the sort key name instead of the partition key.
Using a wrong user ID value.
5fill in blank
hard

Fill all three blanks to query items for UserId '202' in ascending order with correct key and value.

DynamoDB
response = table.query(
    KeyConditionExpression=Key([1]).eq([2]),
    ScanIndexForward=[3]
)
Drag options to blanks, or click blank then click option'
A'UserId'
B'202'
CTrue
DFalse
Attempts:
3 left
💡 Hint
Common Mistakes
Using False instead of True for ascending order.
Using wrong key or value strings.

Practice

(1/5)
1. In DynamoDB, which parameter controls whether query results are returned in ascending or descending order based on the sort key?
easy
A. ProjectionExpression
B. ReturnConsumedCapacity
C. ScanIndexForward
D. ConsistentRead

Solution

  1. Step 1: Understand query ordering in DynamoDB

    DynamoDB orders query results based on the sort key, and the order can be controlled.
  2. Step 2: Identify the controlling parameter

    The parameter ScanIndexForward controls ascending (true) or descending (false) order.
  3. Final Answer:

    ScanIndexForward -> Option C
  4. Quick Check:

    Ordering parameter = ScanIndexForward [OK]
Hint: Remember: ScanIndexForward controls ascending/descending order [OK]
Common Mistakes:
  • Confusing ScanIndexForward with ReturnConsumedCapacity
  • Thinking ordering applies to partition key
  • Assuming default order is descending
2. Which of the following is the correct syntax to query a DynamoDB table named Orders with results in descending order on the sort key OrderDate?
easy
A. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: true })
B. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: false })
C. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, Descending: true })
D. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, OrderBy: 'DESC' })

Solution

  1. Step 1: Identify the parameter for descending order

    To get descending order, ScanIndexForward must be set to false.
  2. Step 2: Check the syntax correctness

    client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :id', ExpressionAttributeValues: { ':id': '123' }, ScanIndexForward: false }) uses ScanIndexForward: false correctly; other options use invalid or wrong parameters.
  3. Final Answer:

    Option B syntax with ScanIndexForward false -> Option B
  4. Quick Check:

    Descending order = ScanIndexForward false [OK]
Hint: Use ScanIndexForward false for descending order [OK]
Common Mistakes:
  • Using ScanIndexForward true for descending order
  • Using non-existent parameters like Descending or OrderBy
  • Confusing partition key with sort key ordering
3. Given a DynamoDB table with partition key UserId and sort key Timestamp, what will be the order of results returned by this query?
client.query({
  TableName: 'UserActivity',
  KeyConditionExpression: 'UserId = :uid',
  ExpressionAttributeValues: { ':uid': 'user123' },
  ScanIndexForward: false
})
medium
A. Results unordered
B. Results ordered by Timestamp ascending (oldest first)
C. Results ordered by UserId ascending
D. Results ordered by Timestamp descending (newest first)

Solution

  1. Step 1: Understand ScanIndexForward effect

    Setting ScanIndexForward: false returns results in descending order of the sort key.
  2. Step 2: Identify the sort key

    The sort key is Timestamp, so results are ordered newest to oldest.
  3. Final Answer:

    Results ordered by Timestamp descending (newest first) -> Option D
  4. Quick Check:

    ScanIndexForward false = descending order [OK]
Hint: ScanIndexForward false means newest items first [OK]
Common Mistakes:
  • Assuming ScanIndexForward false orders by partition key
  • Thinking default order is descending
  • Confusing ascending and descending meanings
4. You wrote this DynamoDB query but the results are always in ascending order, even though you want descending order:
client.query({
  TableName: 'Sales',
  KeyConditionExpression: 'StoreId = :sid',
  ExpressionAttributeValues: { ':sid': 'store1' },
  ScanIndexForward: 'false'
})

What is the error?
medium
A. ScanIndexForward must be a boolean, not a string
B. KeyConditionExpression is incorrect
C. ExpressionAttributeValues is missing a value
D. TableName is invalid

Solution

  1. Step 1: Check ScanIndexForward data type

    ScanIndexForward expects a boolean true or false, not a string.
  2. Step 2: Identify impact of wrong type

    Passing 'false' as a string is truthy, so DynamoDB treats it as true (ascending order).
  3. Final Answer:

    ScanIndexForward must be boolean false, not string 'false' -> Option A
  4. Quick Check:

    Boolean type needed for ScanIndexForward [OK]
Hint: Use boolean false, not string 'false' for ScanIndexForward [OK]
Common Mistakes:
  • Passing 'false' as a string instead of boolean
  • Misunderstanding KeyConditionExpression syntax
  • Ignoring data types in parameters
5. You want to retrieve the 5 most recent orders for customer cust123 from a DynamoDB table Orders with partition key CustomerId and sort key OrderDate. Which query will correctly return these orders in descending order by OrderDate?
hard
A. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: false, Limit: 5 })
B. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: false })
C. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, Limit: 5 })
D. client.query({ TableName: 'Orders', KeyConditionExpression: 'CustomerId = :cid', ExpressionAttributeValues: { ':cid': 'cust123' }, ScanIndexForward: true, Limit: 5 })

Solution

  1. Step 1: Set descending order for most recent first

    Use ScanIndexForward: false to get descending order by OrderDate.
  2. Step 2: Limit results to 5

    Use Limit: 5 to get only the top 5 recent orders.
  3. Final Answer:

    Query with ScanIndexForward false and Limit 5 -> Option A
  4. Quick Check:

    Descending + Limit 5 = ScanIndexForward false + Limit 5 [OK]
Hint: Use ScanIndexForward false with Limit 5 for recent 5 items [OK]
Common Mistakes:
  • Using ScanIndexForward true returns oldest first
  • Omitting Limit returns all items
  • Not combining descending order with limit