azureazure-cosmosdbazure-functionscsx

update and delete documents in cosmos db through azure functions


I am new to cosmos db as well as azure functions and I'm getting nowhere fast. I've been able to find every tutorial under the sun to create and read documents but not update and delete. No one seems to have a full CRUD tutorial using azure functions.

Can someone show me a typical .csx file in azure functions that takes a document in, updates it, and returns an OK response?

I've tried this already

#load "..\Shared\Classes.csx"
using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, 
IEnumerable<Business> businessToBeUpdated, out dynamic updatedBusiness, 
TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");

//compiler requires this assignment
updatedBusiness = null;

// Get request body
Business data = req.Content.ReadAsAsync<Business>().Result;
businessToBeUpdated = businessToBeUpdated.FirstOrDefault<Business>();
log.Info(businessToBeUpdated.Count().ToString());
if(businessToBeUpdated != null && data != null)
{
    //update it
    businessToBeUpdated = data;
    //updatedBusiness.id = data.id;
    log.Info(businessToBeUpdated.website);
}
else{
    return req.CreateResponse(HttpStatusCode.BadRequest);
}

return req.CreateResponse(HttpStatusCode.OK);
}

Here is the binding associated with it.

{
"bindings": [
{
  "authLevel": "anonymous",
  "name": "req",
  "type": "httpTrigger",
  "direction": "in",
  "route": "updatebiz/{id}"
},
{
  "name": "$return",
  "type": "http",
  "direction": "out"
},
{
  "type": "documentDB",
  "name": "businessToBeUpdated",
  "databaseName": "dbname",
  "collectionName": "Businesses",
  "sqlQuery": "Select * FROM c where c.id = {id}",
  "connection": "connection",
  "direction": "in"
},
{
  "type": "documentDB",
  "name": "updatedBusiness",
  "databaseName": "dbname",
  "collectionName": "Businesses",
  "createIfNotExists": false,
  "connection": "connection",
  "direction": "out"
  }
],
"disabled": false
}

Solution

  • The simplest example of a function which updates a document looks exactly the same as the function which creates a document: function will do one or the other based on whether the document with specified id already exists.

    You don't mention which exact problem you face. Your code doesn't even compile, having enumerable and single objects assigned to each other. On top of that, you never assign updatedBusiness to anything other than null.

    I came with a working example which does what I assume you were trying to accomplish.

    csx script:

    using System.Net;
    
    public class Business
    {
        public string id { get; set;}
        public string name { get; set;}
    }
    
    public static HttpResponseMessage Run(HttpRequestMessage req, 
        Business businessToBeUpdated, out Business updatedBusiness, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");
    
        var data = req.Content.ReadAsAsync<Business>().Result;
        if(businessToBeUpdated == null || data == null)
        {
            updatedBusiness = businessToBeUpdated;
            return req.CreateResponse(HttpStatusCode.BadRequest);
        }
    
        updatedBusiness = data; 
        // or merge data and businessToBeUpdated in some desired way
    
        return req.CreateResponse(HttpStatusCode.OK);
    }
    

    function.json:

    {
      "bindings": [
        {
          "authLevel": "anonymous",
          "name": "req",
          "type": "httpTrigger",
          "direction": "in",
          "route": "updatebiz/{id}"
        },
        {
          "name": "$return",
          "type": "http",
          "direction": "out"
        },
        {
          "type": "documentDB",
          "name": "businessToBeUpdated",
          "databaseName": "dbname",
          "collectionName": "Businesses",
          "id": "{id}",
          "connection": "connection",
          "direction": "in"
        },
        {
          "type": "documentDB",
          "name": "updatedBusiness",
          "databaseName": "dbname",
          "collectionName": "Businesses",
          "id": "{id}",
          "connection": "connection",
          "direction": "out"
        }
      ],
      "disabled": false
    }