skip to Main Content

I want to take the raw JSON body from an HTTP post and write it directly into my CosmosDB.

Let’s say the data looks like this:

{
  "id": "123456",
  "storeName": "City Bar and Grille",
  "invoiceTotal": 65
}

However, the documentsOut.AddAsync command uses a format like this:

wait documentsOut.AddAsync(new
  {
    // create a random ID
    id = System.Guid.NewGuid().ToString(),
    body = sourceJson
  });

And then I end up with a document that looks like this:

{
  "id": "0e99d3ab-1956-4c0a-8ec1-99de5c987555",
  "body": {
    "id": "123456",
    "storeName": "City Bar and Grille",
    "invoiceTotal": 65
  }
}

What I really want is to end up with this:

{
  "id": "123456",
  "storeName": "City Bar and Grille",
  "invoiceTotal": 65
}

I’d like to drop the id = System.Guid.NewGuid().ToString() completely (which should not be hard).

How can I pass the raw JSON through without needing to add it to some parent node (such as body)?

2

Answers


  1. Using a similar example as shared by you in the question.
    We can create a Model class with properties which want to store in database.

    enter image description here

    public class StoreDetails : TableEntity
    {
        [JsonProperty("id")]
        public string Id { get; set; } 
        [JsonProperty("storeName")]
        public string StoreName { get; set; }
        [JsonProperty("invoiceTotal")]
        public string InvoiceTotal { get; set; }
    }
    

    Then can create object of model and pass that object to AddAsync()method. As shown in below screenshot.

    enter image description here

            var item = new StoreDetails
            {
                Id = Guid.NewGuid().ToString(),
                StoreName = data.StoreName,
                InvoiceTotal = data.InvoiceTotal
            };
            await storeDetailOut.AddAsync(item);
    

    and when we triggered post API, got response as shown below.

    enter image description here

    As finally we can see the same record is stored in CosmosDB.

    enter image description here

    Login or Signup to reply.
  2. Just to formalize my comment as an answer: You’re specifically creating the body property of the Cosmos DB document you’re creating:

    wait documentsOut.AddAsync(new
      {
        // create a random ID
        id = System.Guid.NewGuid().ToString(),
        body = sourceJson
      });
    

    At the same time, you’re ignoring the incoming ID. Since you wanted to preserve that ID, You can copy the ID over (as long as it remains unique within the partition) instead of generating a new GUID, and also grab individual properties from sourceJson to avoid the nested body element:

    wait documentsOut.AddAsync(new
      {
        id = sourceJson.id,
        storeName = sourceJson.storeName,
        invoiceTotal = sourceJson.invoiceTotal
      });
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search