pretzelb
pretzelb

Reputation: 1221

How to show unique keys on Cosmos DB container?

This link implies that unique keys can be seen in a Cosmos DB container by looking at the settings. However I can't seem to find them using both the portal and the storage explorer. How can you view the unique keys on an existing Cosmos DB container? I have a document that fails to load due to a key violation which should be impossible so I need to confirm what the keys are.

Upvotes: 5

Views: 6311

Answers (5)

Parzifal
Parzifal

Reputation: 41

Azure Portal - Cosmos DB - Export Template Location

Here you can view the ARM template in your Azure Portal, and as the winner comment says You will find the unique keys under the "uniqueKeyPolicy" label.

uniqueKeyPolicy in the ARM Template

Upvotes: 4

Mark Broadbent
Mark Broadbent

Reputation: 411

A slightly easier way to view your Cosmos DB unique keys is to view the ARM template for your resource.

On your Cosmos DB account, click Settings/ Export Template- let the template be generated and view online once complete. You will find them under the "uniqueKeyPolicy" label.

Upvotes: 11

Michael Koltachev
Michael Koltachev

Reputation: 509

Support for showing unique key policy in collection properties will be added soon. Meanwhile you can use DocumentDBStudio to see unique keys in collection. Once unique key policy is set, it cannot be modified.

WRT odd behavior, can you please share full isolated repro and explain expected and actual behavior.

Upvotes: 0

pretzelb
pretzelb

Reputation: 1221

Here is the basic code that worked for me. The code that writes the collection is output in Json format. I think this is similar to what you see in the portal but it skips or omits the uniqueKeyPolicy information.

As a side note I think I found a bug or odd behavior. Inserting a new document can throw unique index constraint violation but updates do not.

            this.EndpointUrl = ConfigurationManager.AppSettings["EndpointUrl"];
        this.PrimaryKey = ConfigurationManager.AppSettings["PrimaryKey"];
        string dbname = ConfigurationManager.AppSettings["dbname"];
        string containername = ConfigurationManager.AppSettings["containername"];
        this.client = new DocumentClient(new Uri(EndpointUrl), PrimaryKey);
        DocumentCollection collection = await client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(dbname, containername));
        Console.WriteLine("\n4. Found Collection \n{0}\n", collection);

Upvotes: 0

Jay Gong
Jay Gong

Reputation: 23782

Based on this blob, unique keys policy should be visible like below:

"uniqueKeyPolicy": {
    "uniqueKeys": [
      {
        "paths": [
          "/name",
          "/country"
        ]
      },
      {
        "paths": [
          "/users/title"
        ]
      }
    ]
  }

However, I could not see it on the portal as same as you. Maybe it's a bug here.

You could use cosmos db sdk as a workaround to get the unique keys policy, please see my java sample code.

ResourceResponse<DocumentCollection> response1 = documentClient.readCollection("dbs/db/colls/test", null);
DocumentCollection coll =response1.getResource();
UniqueKeyPolicy uniqueKeyPolicy = coll.getUniqueKeyPolicy();
Collection<UniqueKey> uniqueKeyCollections = uniqueKeyPolicy.getUniqueKeys();

for(UniqueKey uniqueKey : uniqueKeyCollections){
    System.out.println(uniqueKey.getPaths());
}

Upvotes: 1

Related Questions