Perform advanced DynamoDB query operations using an AWS SDK
The following code examples show how to perform advanced query operations in DynamoDB.
Query tables using various filtering and condition techniques.
Implement pagination for large result sets.
Use Global Secondary Indexes for alternate access patterns.
Apply consistency controls based on application requirements.
Java
SDK for Java 2.x
Query with strongly consistent reads using AWS SDK for Java 2.x.
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public QueryResponse queryWithConsistentReads(
final String tableName,
final String partitionKeyName,
final String partitionKeyValue,
final boolean useConsistentRead) {
CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue);
// Create expression attribute names for the column names
final Map expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName);
// Create expression attribute values for the column values
final Map expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_PK,
AttributeValue.builder().s(partitionKeyValue).build());
// Create the query request
final QueryRequest queryRequest = QueryRequest.builder()
.tableName(tableName)
.keyConditionExpression(KEY_CONDITION_EXPRESSION)
.expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues)
.consistentRead(useConsistentRead)
.build();
try {
final QueryResponse response = dynamoDbClient.query(queryRequest);
LOGGER.log(Level.INFO, "Query successful. Found {0} items", response.count());
return response;
} catch (ResourceNotFoundException e) {
LOGGER.log(Level.SEVERE, "Table not found: {0}", tableName);
throw e;
} catch (DynamoDbException e) {
LOGGER.log(Level.SEVERE, "Error querying with consistent reads", e);
throw e;
}
}
Query using a Global Secondary Index with AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
import java.util.HashMap;
import java.util.Map;
public QueryResponse queryTable(
final String tableName, final String partitionKeyName, final String partitionKeyValue) {
CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue);
// Create expression attribute names for the column names
final Map expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName);
// Create expression attribute values for the column values
final Map expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_PK,
AttributeValue.builder().s(partitionKeyValue).build());
// Create the query request
final QueryRequest queryRequest = QueryRequest.builder()
.tableName(tableName)
.keyConditionExpression(KEY_CONDITION_EXPRESSION)
.expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues)
.build();
try {
final QueryResponse response = dynamoDbClient.query(queryRequest);
System.out.println("Query on base table successful. Found " + response.count() + " items");
return response;
} catch (ResourceNotFoundException e) {
System.err.format("Error: The Amazon DynamoDB table \"%s\" can't be found.\n", tableName);
throw new DynamoDbQueryException("Table not found: " + tableName, e);
} catch (DynamoDbException e) {
System.err.println("Error querying base table: " + e.getMessage());
throw new DynamoDbQueryException("Failed to execute query on base table", e);
}
}
/**
* Queries a DynamoDB Global Secondary Index (GSI) by partition key.
*
* @param tableName The name of the DynamoDB table
* @param indexName The name of the GSI
* @param partitionKeyName The name of the GSI partition key attribute
* @param partitionKeyValue The value of the GSI partition key to query
* @return The query response from DynamoDB
* @throws ResourceNotFoundException if the table or index doesn't exist
* @throws DynamoDbException if the query fails
*/
public QueryResponse queryGlobalSecondaryIndex(
final String tableName, final String indexName, final String partitionKeyName, final String partitionKeyValue) {
CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue);
CodeSampleUtils.validateStringParameter("Index name", indexName);
// Create expression attribute names for the column names
final Map expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_IK, partitionKeyName);
// Create expression attribute values for the column values
final Map expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_IK,
AttributeValue.builder().s(partitionKeyValue).build());
// Create the query request
final QueryRequest queryRequest = QueryRequest.builder()
.tableName(tableName)
.indexName(indexName)
.keyConditionExpression(GSI_KEY_CONDITION_EXPRESSION)
.expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues)
.build();
try {
final QueryResponse response = dynamoDbClient.query(queryRequest);
System.out.println("Query on GSI successful. Found " + response.count() + " items");
return response;
} catch (ResourceNotFoundException e) {
System.err.format(
"Error: The Amazon DynamoDB table \"%s\" or index \"%s\" can't be found.\n", tableName, indexName);
throw new DynamoDbQueryException("Table or index not found: " + tableName + "/" + indexName, e);
} catch (DynamoDbException e) {
System.err.println("Error querying GSI: " + e.getMessage());
throw new DynamoDbQueryException("Failed to execute query on GSI", e);
}
}
Query with complex filters using AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public QueryResponse queryWithComplexFilter(
final String tableName,
final String partitionKeyName,
final String partitionKeyValue,
final String statusAttrName,
final String activeStatus,
final String pendingStatus,
final String priceAttrName,
final double minPrice,
final double maxPrice,
final String categoryAttrName) {
// Validate parameters
CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue);
CodeSampleUtils.validateStringParameter("Status attribute name", statusAttrName);
CodeSampleUtils.validateStringParameter("Active status", activeStatus);
CodeSampleUtils.validateStringParameter("Pending status", pendingStatus);
CodeSampleUtils.validateStringParameter("Price attribute name", priceAttrName);
CodeSampleUtils.validateStringParameter("Category attribute name", categoryAttrName);
CodeSampleUtils.validateNumericRange("Minimum price", minPrice, 0.0, Double.MAX_VALUE);
CodeSampleUtils.validateNumericRange("Maximum price", maxPrice, minPrice, Double.MAX_VALUE);
// Create expression attribute names for the column names
final Map expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put("#pk", partitionKeyName);
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_STATUS, statusAttrName);
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PRICE, priceAttrName);
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_CATEGORY, categoryAttrName);
// Create expression attribute values for the column values
final Map expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(
":pkValue", AttributeValue.builder().s(partitionKeyValue).build());
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_ACTIVE,
AttributeValue.builder().s(activeStatus).build());
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_PENDING,
AttributeValue.builder().s(pendingStatus).build());
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_MIN_PRICE,
AttributeValue.builder().n(String.valueOf(minPrice)).build());
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_MAX_PRICE,
AttributeValue.builder().n(String.valueOf(maxPrice)).build());
// Create the query request
final QueryRequest queryRequest = QueryRequest.builder()
.tableName(tableName)
.keyConditionExpression(KEY_CONDITION_EXPRESSION)
.filterExpression(FILTER_EXPRESSION)
.expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues)
.build();
return dynamoDbClient.query(queryRequest);
}
Query with a dynamically constructed filter expression using AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
import java.util.HashMap;
import java.util.Map;
public static QueryResponse queryWithDynamicFilter(
final String tableName,
final String partitionKeyName,
final String partitionKeyValue,
final Map filterCriteria,
final Region region,
final DynamoDbClient dynamoDbClient) {
validateParameters(tableName, partitionKeyName, partitionKeyValue, filterCriteria);
DynamoDbClient ddbClient = dynamoDbClient;
boolean shouldClose = false;
try {
if (ddbClient == null) {
ddbClient = createClient(region);
shouldClose = true;
}
final QueryWithDynamicFilter queryHelper = new QueryWithDynamicFilter(ddbClient);
return queryHelper.queryWithDynamicFilter(tableName, partitionKeyName, partitionKeyValue, filterCriteria);
} catch (ResourceNotFoundException e) {
System.err.println("Table not found: " + tableName);
throw e;
} catch (DynamoDbException e) {
System.err.println("Failed to execute dynamic filter query: " + e.getMessage());
throw e;
} catch (Exception e) {
System.err.println("Unexpected error during query: " + e.getMessage());
throw e;
} finally {
if (shouldClose && ddbClient != null) {
ddbClient.close();
}
}
}
public static void main(String[] args) {
final String usage =
"""
Usage:
[region]
Where:
tableName - The Amazon DynamoDB table to query.
partitionKeyName - The name of the partition key attribute.
partitionKeyValue - The value of the partition key to query.
filterAttrName - The name of the attribute to filter on.
filterAttrValue - The value to filter by.
region (optional) - The AWS region where the table exists. (Default: us-east-1)
""";
if (args.length < 5) {
System.out.println(usage);
System.exit(1);
}
final String tableName = args[0];
final String partitionKeyName = args[1];
final String partitionKeyValue = args[2];
final String filterAttrName = args[3];
final String filterAttrValue = args[4];
final Region region = args.length > 5 ? Region.of(args[5]) : Region.US_EAST_1;
System.out.println("Querying items with dynamic filter: " + filterAttrName + " = " + filterAttrValue);
try {
// Using the builder pattern to create and execute the query
final QueryResponse response = new DynamicFilterQueryBuilder()
.withTableName(tableName)
.withPartitionKeyName(partitionKeyName)
.withPartitionKeyValue(partitionKeyValue)
.withFilterCriterion(filterAttrName, filterAttrValue)
.withRegion(region)
.execute();
// Process the results
System.out.println("Found " + response.count() + " items:");
response.items().forEach(item -> System.out.println(item));
// Demonstrate multiple filter criteria
System.out.println("\nNow querying with multiple filter criteria:");
Map multipleFilters = new HashMap<>();
multipleFilters.put(filterAttrName, filterAttrValue);
multipleFilters.put("status", "active");
final QueryResponse multiFilterResponse = new DynamicFilterQueryBuilder()
.withTableName(tableName)
.withPartitionKeyName(partitionKeyName)
.withPartitionKeyValue(partitionKeyValue)
.withFilterCriteria(multipleFilters)
.withRegion(region)
.execute();
System.out.println("Found " + multiFilterResponse.count() + " items with multiple filters:");
multiFilterResponse.items().forEach(item -> System.out.println(item));
} catch (IllegalArgumentException e) {
System.err.println("Invalid input: " + e.getMessage());
System.exit(1);
} catch (ResourceNotFoundException e) {
System.err.println("Table not found: " + tableName);
System.exit(1);
} catch (DynamoDbException e) {
System.err.println("DynamoDB error: " + e.getMessage());
System.exit(1);
} catch (Exception e) {
System.err.println("Unexpected error: " + e.getMessage());
System.exit(1);
}
}
Query with a filter expression and limit using AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
public QueryResponse queryWithFilterAndLimit(
final String tableName,
final String partitionKeyName,
final String partitionKeyValue,
final String filterAttrName,
final String filterAttrValue,
final int limit) {
CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue);
CodeSampleUtils.validateStringParameter("Filter attribute name", filterAttrName);
CodeSampleUtils.validateStringParameter("Filter attribute value", filterAttrValue);
CodeSampleUtils.validatePositiveInteger("Limit", limit);
// Create expression attribute names for the column names
final Map expressionAttributeNames = new HashMap<>();
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName);
expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_FILTER, filterAttrName);
// Create expression attribute values for the column values
final Map expressionAttributeValues = new HashMap<>();
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_PK,
AttributeValue.builder().s(partitionKeyValue).build());
expressionAttributeValues.put(
EXPRESSION_ATTRIBUTE_VALUE_FILTER,
AttributeValue.builder().s(filterAttrValue).build());
// Create the filter expression
final String filterExpression = "#filterAttr = :filterValue";
// Create the query request
final QueryRequest queryRequest = QueryRequest.builder()
.tableName(tableName)
.keyConditionExpression(KEY_CONDITION_EXPRESSION)
.filterExpression(filterExpression)
.expressionAttributeNames(expressionAttributeNames)
.expressionAttributeValues(expressionAttributeValues)
.limit(limit)
.build();
try {
final QueryResponse response = dynamoDbClient.query(queryRequest);
LOGGER.log(Level.INFO, "Query with filter and limit successful. Found {0} items", response.count());
LOGGER.log(
Level.INFO, "ScannedCount: {0} (total items evaluated before filtering)", response.scannedCount());
return response;
} catch (ResourceNotFoundException e) {
LOGGER.log(Level.SEVERE, "Table not found: {0}", tableName);
throw e;
} catch (DynamoDbException e) {
LOGGER.log(Level.SEVERE, "Error querying with filter and limit: {0}", e.getMessage());
throw e;
}
}
For API details, see
Query
in AWS SDK for Java 2.x API Reference.
JavaScript
SDK for JavaScript (v3)
Query with strongly consistent reads using AWS SDK for JavaScript.
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
/**
* Queries a DynamoDB table with configurable read consistency
*
* @param {Object} config - AWS SDK configuration object
* @param {string} tableName - The name of the DynamoDB table
* @param {string} partitionKeyName - The name of the partition key
* @param {string} partitionKeyValue - The value of the partition key
* @param {boolean} useConsistentRead - Whether to use strongly consistent reads
* @returns {Promise
Query using a Global Secondary Index with AWS SDK for JavaScript.
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
/**
* Queries a DynamoDB table using the primary key
*
* @param {Object} config - AWS SDK configuration object
* @param {string} tableName - The name of the DynamoDB table
* @param {string} userId - The user ID to query by (partition key)
* @returns {Promise
Query with pagination using AWS SDK for JavaScript.
/**
* Example demonstrating how to handle large query result sets in DynamoDB using pagination
*
* This example shows:
* - How to use pagination to handle large result sets
* - How to use LastEvaluatedKey to retrieve the next page of results
* - How to construct subsequent query requests using ExclusiveStartKey
*/
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
/**
* Queries a DynamoDB table with pagination to handle large result sets
*
* @param {Object} config - AWS SDK configuration object
* @param {string} tableName - The name of the DynamoDB table
* @param {string} partitionKeyName - The name of the partition key
* @param {string} partitionKeyValue - The value of the partition key
* @param {number} pageSize - Number of items per page
* @returns {Promise} - All items from the query
*/
async function queryWithPagination(
config,
tableName,
partitionKeyName,
partitionKeyValue,
pageSize = 25
) {
try {
// Create DynamoDB client
const client = new DynamoDBClient(config);
// Initialize variables for pagination
let lastEvaluatedKey = undefined;
const allItems = [];
let pageCount = 0;
// Loop until all pages are retrieved
do {
// Construct the query input
const input = {
TableName: tableName,
KeyConditionExpression: "#pk = :pkValue",
Limit: pageSize,
ExpressionAttributeNames: {
"#pk": partitionKeyName
},
ExpressionAttributeValues: {
":pkValue": { S: partitionKeyValue }
}
};
// Add ExclusiveStartKey if we have a LastEvaluatedKey from a previous query
if (lastEvaluatedKey) {
input.ExclusiveStartKey = lastEvaluatedKey;
}
// Execute the query
const command = new QueryCommand(input);
const response = await client.send(command);
// Process the current page of results
pageCount++;
console.log(`Processing page ${pageCount} with ${response.Items.length} items`);
// Add the items from this page to our collection
if (response.Items && response.Items.length > 0) {
allItems.push(...response.Items);
}
// Get the LastEvaluatedKey for the next page
lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey); // Continue until there are no more pages
console.log(`Query complete. Retrieved ${allItems.length} items in ${pageCount} pages.`);
return allItems;
} catch (error) {
console.error(`Error querying with pagination: ${error}`);
throw error;
}
}
/**
* Example usage:
*
* // Query all items in the "AWS DynamoDB" forum with pagination
* const allItems = await queryWithPagination(
* { region: "us-west-2" },
* "ForumThreads",
* "ForumName",
* "AWS DynamoDB",
* 25 // 25 items per page
* );
*
* console.log(`Total items retrieved: ${allItems.length}`);
*
* // Notes on pagination:
* // - LastEvaluatedKey contains the primary key of the last evaluated item
* // - When LastEvaluatedKey is undefined/null, there are no more items to retrieve
* // - ExclusiveStartKey tells DynamoDB where to start the next page
* // - Pagination helps manage memory usage for large result sets
* // - Each page requires a separate network request to DynamoDB
*/
module.exports = { queryWithPagination };
Query with complex filters using AWS SDK for JavaScript.
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
/**
* Queries a DynamoDB table with a complex filter expression
*
* @param {Object} config - AWS SDK configuration object
* @param {string} tableName - The name of the DynamoDB table
* @param {string} partitionKeyName - The name of the partition key
* @param {string} partitionKeyValue - The value of the partition key
* @param {number|string} minViews - Minimum number of views for filtering
* @param {number|string} minReplies - Minimum number of replies for filtering
* @param {string} requiredTag - Tag that must be present in the item's tags set
* @returns {Promise} - The query response
*/
async function queryWithComplexFilter(
config,
tableName,
partitionKeyName,
partitionKeyValue,
minViews,
minReplies,
requiredTag
) {
try {
// Create DynamoDB client
const client = new DynamoDBClient(config);
// Construct the query input
const input = {
TableName: tableName,
KeyConditionExpression: "#pk = :pkValue",
FilterExpression: "views >= :minViews AND replies >= :minReplies AND contains(tags, :tag)",
ExpressionAttributeNames: {
"#pk": partitionKeyName
},
ExpressionAttributeValues: {
":pkValue": { S: partitionKeyValue },
":minViews": { N: minViews.toString() },
":minReplies": { N: minReplies.toString() },
":tag": { S: requiredTag }
}
};
// Execute the query
const command = new QueryCommand(input);
return await client.send(command);
} catch (error) {
console.error(`Error querying with complex filter: ${error}`);
throw error;
}
}
Query with a dynamically constructed filter expression using AWS SDK for JavaScript.
const { DynamoDBClient, QueryCommand } = require("@aws-sdk/client-dynamodb");
async function queryWithDynamicFilter(
config,
tableName,
partitionKeyName,
partitionKeyValue,
sortKeyName,
sortKeyValue,
filterParams = {}
) {
try {
// Create DynamoDB client
const client = new DynamoDBClient(config);
// Initialize filter expression components
let filterExpressions = [];
const expressionAttributeValues = {
":pkValue": { S: partitionKeyValue },
":skValue": { S: sortKeyValue }
};
const expressionAttributeNames = {
"#pk": partitionKeyName,
"#sk": sortKeyName
};
// Add status filter if provided
if (filterParams.status) {
filterExpressions.push("status = :status");
expressionAttributeValues[":status"] = { S: filterParams.status };
}
// Add minimum views filter if provided
if (filterParams.minViews !== undefined) {
filterExpressions.push("views >= :minViews");
expressionAttributeValues[":minViews"] = { N: filterParams.minViews.toString() };
}
// Add author filter if provided
if (filterParams.author) {
filterExpressions.push("author = :author");
expressionAttributeValues[":author"] = { S: filterParams.author };
}
// Construct the query input
const input = {
TableName: tableName,
KeyConditionExpression: "#pk = :pkValue AND #sk = :skValue"
};
// Add filter expression if any filters were provided
if (filterExpressions.length > 0) {
input.FilterExpression = filterExpressions.join(" AND ");
}
// Add expression attribute names and values
input.ExpressionAttributeNames = expressionAttributeNames;
input.ExpressionAttributeValues = expressionAttributeValues;
// Execute the query
const command = new QueryCommand(input);
return await client.send(command);
} catch (error) {
console.error(`Error querying with dynamic filter: ${error}`);
throw error;
}
}
For API details, see
Query
in AWS SDK for JavaScript API Reference.
Python
SDK for Python (Boto3)
Query with strongly consistent reads using AWS SDK for Python (Boto3).
import time
import boto3
from boto3.dynamodb.conditions import Key
def query_with_consistent_read(
table_name,
partition_key_name,
partition_key_value,
sort_key_name=None,
sort_key_value=None,
consistent_read=True,
):
"""
Query a DynamoDB table with the option for strongly consistent reads.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
sort_key_name (str, optional): The name of the sort key attribute.
sort_key_value (str, optional): The value of the sort key to query.
consistent_read (bool, optional): Whether to use strongly consistent reads. Defaults to True.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Build the key condition expression
key_condition = Key(partition_key_name).eq(partition_key_value)
if sort_key_name and sort_key_value:
key_condition = key_condition & Key(sort_key_name).eq(sort_key_value)
# Perform the query with the consistent read option
response = table.query(KeyConditionExpression=key_condition, ConsistentRead=consistent_read)
return response
Query using a Global Secondary Index with AWS SDK for Python (Boto3).
import boto3
from boto3.dynamodb.conditions import Key
def query_table(table_name, partition_key_name, partition_key_value):
"""
Query a DynamoDB table using its primary key.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Perform the query on the table's primary key
response = table.query(KeyConditionExpression=Key(partition_key_name).eq(partition_key_value))
return response
def query_gsi(table_name, index_name, partition_key_name, partition_key_value):
"""
Query a Global Secondary Index (GSI) on a DynamoDB table.
Args:
table_name (str): The name of the DynamoDB table.
index_name (str): The name of the Global Secondary Index.
partition_key_name (str): The name of the GSI's partition key attribute.
partition_key_value (str): The value of the GSI's partition key to query.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Perform the query on the GSI
response = table.query(
IndexName=index_name, KeyConditionExpression=Key(partition_key_name).eq(partition_key_value)
)
return response
Query with pagination using AWS SDK for Python (Boto3).
import boto3
from boto3.dynamodb.conditions import Key
def query_with_pagination(
table_name, partition_key_name, partition_key_value, page_size=25, max_pages=None
):
"""
Query a DynamoDB table with pagination to handle large result sets.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
page_size (int, optional): The number of items to return per page. Defaults to 25.
max_pages (int, optional): The maximum number of pages to retrieve. If None, retrieves all pages.
Returns:
list: All items retrieved from the query across all pages.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Initialize variables for pagination
last_evaluated_key = None
page_count = 0
all_items = []
# Paginate through the results
while True:
# Check if we've reached the maximum number of pages
if max_pages is not None and page_count >= max_pages:
break
# Prepare the query parameters
query_params = {
"KeyConditionExpression": Key(partition_key_name).eq(partition_key_value),
"Limit": page_size,
}
# Add the ExclusiveStartKey if we have a LastEvaluatedKey from a previous query
if last_evaluated_key:
query_params["ExclusiveStartKey"] = last_evaluated_key
# Execute the query
response = table.query(**query_params)
# Process the current page of results
items = response.get("Items", [])
all_items.extend(items)
# Update pagination tracking
page_count += 1
# Get the LastEvaluatedKey for the next page, if any
last_evaluated_key = response.get("LastEvaluatedKey")
# If there's no LastEvaluatedKey, we've reached the end of the results
if not last_evaluated_key:
break
return all_items
def query_with_pagination_generator(
table_name, partition_key_name, partition_key_value, page_size=25
):
"""
Query a DynamoDB table with pagination using a generator to handle large result sets.
This approach is memory-efficient as it yields one page at a time.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
page_size (int, optional): The number of items to return per page. Defaults to 25.
Yields:
tuple: A tuple containing (items, page_number, last_page) where:
- items is a list of items for the current page
- page_number is the current page number (starting from 1)
- last_page is a boolean indicating if this is the last page
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Initialize variables for pagination
last_evaluated_key = None
page_number = 0
# Paginate through the results
while True:
# Prepare the query parameters
query_params = {
"KeyConditionExpression": Key(partition_key_name).eq(partition_key_value),
"Limit": page_size,
}
# Add the ExclusiveStartKey if we have a LastEvaluatedKey from a previous query
if last_evaluated_key:
query_params["ExclusiveStartKey"] = last_evaluated_key
# Execute the query
response = table.query(**query_params)
# Get the current page of results
items = response.get("Items", [])
page_number += 1
# Get the LastEvaluatedKey for the next page, if any
last_evaluated_key = response.get("LastEvaluatedKey")
# Determine if this is the last page
is_last_page = last_evaluated_key is None
# Yield the current page of results
yield (items, page_number, is_last_page)
# If there's no LastEvaluatedKey, we've reached the end of the results
if is_last_page:
break
Query with complex filters using AWS SDK for Python (Boto3).
import boto3
from boto3.dynamodb.conditions import Attr, Key
def query_with_complex_filter(
table_name,
partition_key_name,
partition_key_value,
min_rating=None,
status_list=None,
max_price=None,
):
"""
Query a DynamoDB table with a complex filter expression.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
min_rating (float, optional): Minimum rating value for filtering.
status_list (list, optional): List of status values to include.
max_price (float, optional): Maximum price value for filtering.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Start with the key condition expression
key_condition = Key(partition_key_name).eq(partition_key_value)
# Initialize the filter expression and expression attribute values
filter_expression = None
expression_attribute_values = {}
# Build the filter expression based on provided parameters
if min_rating is not None:
filter_expression = Attr("rating").gte(min_rating)
expression_attribute_values[":min_rating"] = min_rating
if status_list and len(status_list) > 0:
status_condition = None
for i, status in enumerate(status_list):
status_value_name = f":status{i}"
expression_attribute_values[status_value_name] = status
if status_condition is None:
status_condition = Attr("status").eq(status)
else:
status_condition = status_condition | Attr("status").eq(status)
if filter_expression is None:
filter_expression = status_condition
else:
filter_expression = filter_expression & status_condition
if max_price is not None:
price_condition = Attr("price").lte(max_price)
expression_attribute_values[":max_price"] = max_price
if filter_expression is None:
filter_expression = price_condition
else:
filter_expression = filter_expression & price_condition
# Prepare the query parameters
query_params = {"KeyConditionExpression": key_condition}
if filter_expression:
query_params["FilterExpression"] = filter_expression
if expression_attribute_values:
query_params["ExpressionAttributeValues"] = expression_attribute_values
# Execute the query
response = table.query(**query_params)
return response
def query_with_complex_filter_and_or(
table_name,
partition_key_name,
partition_key_value,
category=None,
min_rating=None,
max_price=None,
):
"""
Query a DynamoDB table with a complex filter expression using AND and OR operators.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
category (str, optional): Category value for filtering.
min_rating (float, optional): Minimum rating value for filtering.
max_price (float, optional): Maximum price value for filtering.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Start with the key condition expression
key_condition = Key(partition_key_name).eq(partition_key_value)
# Build a complex filter expression with AND and OR operators
filter_expression = None
expression_attribute_values = {}
# Build the category condition
if category:
filter_expression = Attr("category").eq(category)
expression_attribute_values[":category"] = category
# Build the rating and price condition (rating >= min_rating OR price <= max_price)
rating_price_condition = None
if min_rating is not None:
rating_price_condition = Attr("rating").gte(min_rating)
expression_attribute_values[":min_rating"] = min_rating
if max_price is not None:
price_condition = Attr("price").lte(max_price)
expression_attribute_values[":max_price"] = max_price
if rating_price_condition is None:
rating_price_condition = price_condition
else:
rating_price_condition = rating_price_condition | price_condition
# Combine the conditions
if rating_price_condition:
if filter_expression is None:
filter_expression = rating_price_condition
else:
filter_expression = filter_expression & rating_price_condition
# Prepare the query parameters
query_params = {"KeyConditionExpression": key_condition}
if filter_expression:
query_params["FilterExpression"] = filter_expression
if expression_attribute_values:
query_params["ExpressionAttributeValues"] = expression_attribute_values
# Execute the query
response = table.query(**query_params)
return response
Query with a dynamically constructed filter expression using AWS SDK for Python (Boto3).
import boto3
from boto3.dynamodb.conditions import Attr, Key
def query_with_dynamic_filter(
table_name, partition_key_name, partition_key_value, filter_conditions=None
):
"""
Query a DynamoDB table with a dynamically constructed filter expression.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
filter_conditions (dict, optional): A dictionary of filter conditions where
keys are attribute names and values are dictionaries with 'operator' and 'value'.
Example: {'rating': {'operator': '>=', 'value': 4}, 'status': {'operator': '=', 'value': 'active'}}
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Start with the key condition expression
key_condition = Key(partition_key_name).eq(partition_key_value)
# Initialize variables for the filter expression and attribute values
filter_expression = None
expression_attribute_values = {":pk_val": partition_key_value}
# Dynamically build the filter expression if filter conditions are provided
if filter_conditions:
for attr_name, condition in filter_conditions.items():
operator = condition.get("operator")
value = condition.get("value")
attr_value_name = f":{attr_name}"
expression_attribute_values[attr_value_name] = value
# Create the appropriate filter expression based on the operator
current_condition = None
if operator == "=":
current_condition = Attr(attr_name).eq(value)
elif operator == "!=":
current_condition = Attr(attr_name).ne(value)
elif operator == ">":
current_condition = Attr(attr_name).gt(value)
elif operator == ">=":
current_condition = Attr(attr_name).gte(value)
elif operator == "<":
current_condition = Attr(attr_name).lt(value)
elif operator == "<=":
current_condition = Attr(attr_name).lte(value)
elif operator == "contains":
current_condition = Attr(attr_name).contains(value)
elif operator == "begins_with":
current_condition = Attr(attr_name).begins_with(value)
# Combine with existing filter expression using AND
if current_condition:
if filter_expression is None:
filter_expression = current_condition
else:
filter_expression = filter_expression & current_condition
# Perform the query with the dynamically built filter expression
query_params = {"KeyConditionExpression": key_condition}
if filter_expression:
query_params["FilterExpression"] = filter_expression
response = table.query(**query_params)
return response
Query with a filter expression and limit using AWS SDK for Python (Boto3).
import boto3
from boto3.dynamodb.conditions import Attr, Key
def query_with_filter_and_limit(
table_name,
partition_key_name,
partition_key_value,
filter_attribute=None,
filter_value=None,
limit=10,
):
"""
Query a DynamoDB table with a filter expression and limit the number of results.
Args:
table_name (str): The name of the DynamoDB table.
partition_key_name (str): The name of the partition key attribute.
partition_key_value (str): The value of the partition key to query.
filter_attribute (str, optional): The attribute name to filter on.
filter_value (any, optional): The value to compare against in the filter.
limit (int, optional): The maximum number of items to evaluate. Defaults to 10.
Returns:
dict: The response from DynamoDB containing the query results.
"""
# Initialize the DynamoDB resource
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Build the key condition expression
key_condition = Key(partition_key_name).eq(partition_key_value)
# Prepare the query parameters
query_params = {"KeyConditionExpression": key_condition, "Limit": limit}
# Add the filter expression if filter attributes are provided
if filter_attribute and filter_value is not None:
query_params["FilterExpression"] = Attr(filter_attribute).gt(filter_value)
query_params["ExpressionAttributeValues"] = {":filter_value": filter_value}
# Execute the query
response = table.query(**query_params)
return response
For API details, see
Query
in AWS SDK for Python (Boto3) API Reference.
For a complete list of AWS SDK developer guides and code examples, see
Using DynamoDB with an AWS SDK.
This topic also includes information about getting started and details about previous SDK versions.
Did this page help you? - Yes
Thanks for letting us know we're doing a good job!
If you've got a moment, please tell us what we did right so we can do more of it.
Did this page help you? - No
Thanks for letting us know this page needs work. We're sorry we let you down.
If you've got a moment, please tell us how we can make the documentation better.