Explore various ways to query data in Azure Cosmos DB using the official Java SDK. These samples cover common scenarios and demonstrate best practices for efficient data retrieval.
Efficiently retrieve a single document by its unique ID and partition key.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
// Assuming 'client' is an initialized CosmosClient and 'container' is a CosmosContainer
// Define the document ID and partition key
String documentId = "myDocumentId";
String partitionKeyFieldValue = "myPartitionKey";
CosmosItemId id = CosmosItemId.of(documentId);
PartitionKey partitionKey = new PartitionKey(partitionKeyFieldValue);
try {
CosmosItemResponse response = container.getItem(id, partitionKey, MyDocument.class).read();
MyDocument document = response.getItem();
System.out.println("Retrieved document: " + document);
} catch (CosmosException e) {
System.err.println("Error retrieving document: " + e.getMessage());
}
Execute a SQL query against your Cosmos DB container to filter and project data.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import com.azure.cosmos.util.CosmosPagedIterable;
// Assuming 'container' is a CosmosContainer
String query = "SELECT VALUE r FROM r WHERE r.category = 'Electronics'";
CosmosPagedIterable<MyDocument> feedResponse = container.queryItems(query, new QueryRequestOptions(), MyDocument.class);
for (MyDocument item : feedResponse) {
System.out.println("Found item: " + item);
}
Use parameterized queries to prevent SQL injection and improve performance with cached query plans.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import com.azure.cosmos.util.CosmosPagedIterable;
import java.util.Arrays;
import java.util.List;
// Assuming 'container' is a CosmosContainer
String query = "SELECT VALUE r FROM r WHERE r.status = @status and r.age > @minAge";
String statusValue = "Active";
int minAgeValue = 30;
QueryDefinition queryDefinition = new QueryDefinition(query)
.setParameter("@status", statusValue)
.setParameter("@minAge", minAgeValue);
QueryRequestOptions options = new QueryRequestOptions();
CosmosPagedIterable<MyDocument> feedResponse = container.queryItems(queryDefinition, options, MyDocument.class);
for (MyDocument item : feedResponse) {
System.out.println("Found item: " + item);
}
Sort results and limit the number of items returned using ORDER BY and TOP.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import com.azure.cosmos.util.CosmosPagedIterable;
// Assuming 'container' is a CosmosContainer
String query = "SELECT TOP 5 r.name, r.creationDate FROM r WHERE r.isActive = true ORDER BY r.creationDate DESC";
CosmosPagedIterable<MyDocument> feedResponse = container.queryItems(query, new QueryRequestOptions(), MyDocument.class);
for (MyDocument item : feedResponse) {
System.out.println("Item: " + item.getName() + ", Created: " + item.getCreationDate());
}
Access and filter data within nested JSON objects.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import com.azure.cosmos.util.CosmosPagedIterable;
// Assuming 'container' is a CosmosContainer
// Assuming MyDocument has a property like 'address' which is an object with 'city'
String query = "SELECT VALUE r FROM r WHERE r.address.city = 'New York'";
CosmosPagedIterable<MyDocument> feedResponse = container.queryItems(query, new QueryRequestOptions(), MyDocument.class);
for (MyDocument item : feedResponse) {
System.out.println("Found item in New York: " + item);
}
Perform aggregate operations on your data.
import com.azure.cosmos.*;
import com.azure.cosmos.models.*;
import com.azure.cosmos.util.CosmosPagedIterable;
// Assuming 'container' is a CosmosContainer
// Example: Count items with status 'Pending'
String countQuery = "SELECT COUNT(r) FROM r WHERE r.status = 'Pending'";
CosmosPagedIterable<Integer> countResponse = container.queryItems(countQuery, new QueryRequestOptions(), Integer.class);
Integer pendingCount = countResponse.iterator().next();
System.out.println("Number of pending items: " + pendingCount);
// Example: Sum of 'price' for items in 'Books' category
String sumQuery = "SELECT SUM(r.price) FROM r WHERE r.category = 'Books'";
CosmosPagedIterable<Double> sumResponse = container.queryItems(sumQuery, new QueryRequestOptions(), Double.class);
Double totalBookPrice = sumResponse.iterator().next();
System.out.println("Total price of books: " + totalBookPrice);
QueryRequestOptions for features like maxItemCount, partitionKey, and enableCrossPartitionQuery.CosmosPagedIterable.For more in-depth information, please refer to the Azure Cosmos DB SQL Query Overview and the Azure Cosmos DB Java SDK Samples repository on GitHub.