This documentation is not maintained. Please refer to doc.castsoftware.com/technologies to find the latest updates.

CAST supports Azure Cosmos DB via its com.castsoftware.nosqljava extension. Details about the support provided for Java source code is explained below.

Supported Client Libraries

Supported Operations

Operations
Method Supported
InsertMethods supported for insertv - v2

com.microsoft.azure.documentdb.DocumentClient.createDocument

com.microsoft.azure.documentdb.DocumentClient.createCollection

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.createDocument

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.createCollection

InsertMethods supported for insert - v4

com.azure.cosmos.CosmosAsyncContainer.createItem

com.azure.cosmos.CosmosContainer.createItem

UpdateMethods supported for Update - v2

com.microsoft.azure.documentdb.DocumentClient.replaceDocument

com.microsoft.azure.documentdb.DocumentClient.upsertDocument

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.replaceDocument

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.replaceCollection

UpdateMethods supported for update - v4

com.azure.cosmos.CosmosAsyncContainer.replaceItem

com.azure.cosmos.CosmosAsyncContainer.replace

com.azure.cosmos.CosmosContainer.replace

com.azure.cosmos.CosmosContainer.replaceItem

SelectMethod supported for select - v2

com.microsoft.azure.documentdb.DocumentClient.queryDocuments

com.microsoft.azure.documentdb.DocumentClient.readDocument

com.microsoft.azure.documentdb.DocumentClient.readCollection

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.queryDocuments

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.readDocument

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.readCollection

com.azure.cosmos.CosmosAsyncContainer.queryItems

SelectMethods supported for select - v4

com.azure.cosmos.CosmosAsyncContainer.readItem

com.azure.cosmos.CosmosAsyncContainer.getId

com.azure.cosmos.CosmosAsyncContainer.read

com.azure.cosmos.CosmosAsyncContainer.readAllItems

com.azure.cosmos.CosmosAsyncContainer.readMany

com.azure.cosmos.CosmosContainer.getId

com.azure.cosmos.CosmosContainer.queryItems

com.azure.cosmos.CosmosContainer.read

com.azure.cosmos.CosmosContainer.readItem

com.azure.cosmos.CosmosContainer.readAllItems

com.azure.cosmos.CosmosContainer.readMany

DeleteMethods supported for delete - v2

com.microsoft.azure.documentdb.DocumentClient.deleteDocument

com.microsoft.azure.documentdb.DocumentClient.deleteCollection

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.deleteDocument

com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient.deleteCollection

DeleteMethods supported for delete - v4

com.azure.cosmos.CosmosAsyncContainer.delete

com.azure.cosmos.CosmosAsyncContainer.deleteItem

com.azure.cosmos.CosmosContainer.delete

com.azure.cosmos.CosmosContainer.deleteItem

Above mentioned methods are supported for both Synchronous and Asynchronous clients.

Objects

IconDescription

Java CosmosDB Database

Java CosmosDB Collection

Java Unknown CosmosDB Database

Java Unknown CosmosDB Collection
Link typeSource and destination of linkMethods Supported
belongsTo

From Java CosmosDB Collection object to Java CosmosDB Database object

-
useLinkBetween the caller Java Method objects and Java CosmosDB Collection object

CreateCollection

useInsertLinkBetween the caller Java Method objects and Java CosmosDB Collection object

CreateDocument

createItem

useUpdateLinkBetween the caller Java Method objects and Java CosmosDB Collection object

ReplaceDocument

replaceItem

useSelectLink

Between the caller Java Method objects and Java CosmosDB Collection object

ReadDocument

ReadDocuments

QueryDocuments

ReadCollection

queryItems

readItem

readAllItems

readMany

useDeleteLinkBetween the caller Java Method objects and Java CosmosDB Collection object

DeleteDocument

DeleteCollection

deleteItem

What results can you expect?

 Some example scenarios are shown below:

Cosmos DB Client Creation

CosmoDB client creation

private static final String HOST = "[YOUR_ENDPOINT_HERE]";
 private static final String MASTER_KEY = "[YOUR_KEY_HERE]";
 
 private static DocumentClient documentClient = new DocumentClient(HOST, MASTER_KEY,
                 ConnectionPolicy.GetDefault(), ConsistencyLevel.Session);
 
 public static DocumentClient getDocumentClient() {
     return documentClient;
 }

CosmoDb Async client creation

import com.microsoft.azure.cosmosdb.rx.AsyncDocumentClient;
    
public AsyncDocumentClient client = new AsyncDocumentClient.Builder()
            .withServiceEndpoint(AccountSettings.HOST)
            .withMasterKeyOrResourceToken(AccountSettings.MASTER_KEY)
            .withConnectionPolicy(ConnectionPolicy.GetDefault())
            .withConsistencyLevel(ConsistencyLevel.Eventual)
            .build();

Insert Data Operation

v2

	public static Family andersenFamily = new Family();

	public void TestCreateDocument() throws DocumentClientException {
		// Insert your Java objects as documents
		System.out.println("Creating doc");

		andersenFamily.setId("Andersen.1");
		andersenFamily.setLastName("Andersen");

		this.client.createDocument("/dbs/familydb/colls/familycoll", andersenFamily, new RequestOptions(), true);

		System.out.println("Done Creating doc");
	}

v4

@Override
  public Single<OutcomingAccountStatus> createStatus(IncomingCreateAccountStatus incoming) {

    Mono<YapeAccountStatus> createYapeAccountStatus =
        defer(() -> {
          YapeAccountStatus yapeAccountStatus = new YapeAccountStatus();
          yapeAccountStatus.setId(generateId());
          yapeAccountStatus.setIdYapeAccount(incoming.getIdYapeAccount());
          yapeAccountStatus.setStatus(incoming.getStatus());
          yapeAccountStatus.setCreationDate(incoming.getCreationDate());

          return cosmosAsyncDatabase.getContainer(CONTAINER_YAPE_ACCOUNT_STATUS)
              .createItem(yapeAccountStatus,
                  new PartitionKey(yapeAccountStatus.getIdYapeAccount()),
                  new CosmosItemRequestOptions())
              .retryWhen(noLongerAvailable)
              .map(itemResponse -> yapeAccountStatus);
        }

Select Data Operation

v2

public void TestQueryDocuments() {

		System.out.println("Querying db...");
		FeedResponse<Document> queryResults = this.client.queryDocuments("/dbs/familydb/colls/familycoll",
				"SELECT * FROM Family WHERE Family.id = 'Andersen.1'", null);

		System.out.println("Running SQL query...");
		for (Document family : queryResults.getQueryIterable()) {
			System.out.println(String.format("\tRead %s", family));
		}

	}

public void TestReadDocument() throws DocumentClientException {
		this.client.readDocument("/dbs/familydb/colls/familycoll/docs/Andersen.1", null);
	}

public void TestReadDocuments() throws DocumentClientException {
		this.client.readDocuments("/dbs/familydb", null);
	}

v4

private Mono<YapeAccountStatus> getLastStatusMono(String idYapeAccount) {
SqlQuerySpec sqsGetLastStatusQuery = SqlBuilder.create()
.query("select top 1 s.status from s where s.idYapeAccount = @idYapeAccount "
+ "and s.status != @statusDeleted order by s.creationDate desc")
.parameters(
new SqlParameter("@idYapeAccount", idYapeAccount),
new SqlParameter("@statusDeleted", AccountStatus.DELETED.getCode()))
.buildSqlQuerySpec();

CosmosQueryRequestOptions options = new CosmosQueryRequestOptions();
options.setPartitionKey(new PartitionKey(idYapeAccount));

return cosmosAsyncDatabase.getContainer(CONTAINER_YAPE_ACCOUNT_STATUS)
.queryItems(sqsGetLastStatusQuery, options, YapeAccountStatus.class)
.singleOrEmpty()
.retryWhen(noLongerAvailable);
}

Update Operation

v2

public void TestReplaceDocument() throws DocumentClientException {
		// Update a property
		andersenFamily.setLastName("Petersons");
		this.client.replaceDocument("/dbs/familydb/colls/familycoll/docs/Andersen.1", andersenFamily, null);
	}

v4

 private Mono<BlockedResources> replaceItem(BlockedResources blockedResources, CosmosItemRequestOptions options) {

    return getBlockedResourcesContainer().replaceItem(blockedResources, blockedResources.getId(),
        new PartitionKey(blockedResources.getResource()), options)
        .retryWhen(noLongerAvailable)
        .doOnSuccess(itemResponse -> blockedResources.set_etag(itemResponse.getETag()))
        .map(itemResponse -> blockedResources);
  }

Delete Operation

public void TestDeleteDocument() throws DocumentClientException {
		this.client.deleteDocument("", null);
	}

Known Limitations

Major limitations

No support for Cassandra API, MongoDB API, Gremlin API, Table API or other APIs built by Microsoft for accessing an Azure Cosmos DB service. See the API reference here:

Minor limitations     

  • Database and collection names are resolved as known objects when a connection string is passed to the client directly:

    • Example: This connection string is passed to client - "/dbs/familydb/colls/familycoll" 

  • Database and collection are marked as Unknown when Database Collection and document objects are passed as an argument in CRUD methods.

  • Runtime Ambiguities are not resolved:

    • Example: Different databases are accessed in if/else cases based on some conditions