Tasks
Create database and API for simple ToDo list application:
- Create a new collection
- Replicate the database to three different regions
- Change Default consistency to Eventual
- Turn on automatic failover and set up your order
- Create a function that allows adding new ToDo items to the database.
- Create a function that will list all ToDo items assigned to list.
- Try to test your solution
- Remove description from indexing
ToDo item structure:
- name
- description
- due date
- status – to do or done
- assigned list name
Materials
Documentation
Azure Cosmos DB bindings for Azure Functions 2.x
Code samples
Trigger
[FunctionName("CollectionChangeMonitor")] public static void Run([CosmosDBTrigger( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection", LeaseCollectionName = "leases", CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents, ILogger log) { if (documents != null && documents.Count > 0) { log.LogInformation("Documents modified " + documents.Count); foreach (var document in documents) { log.LogInformation("Document Id " + document.Id); log.LogInformation("Family name " + document.GetPropertyValue<string>("lastName")); log.LogInformation(Environment.NewLine); } } }
Read access
[FunctionName("SearchById")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "family/{lastName}/{id}")]HttpRequestMessage req, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection", PartitionKey = "{lastName}", Id = "{id}")] Family family, ILogger log) { log.LogInformation("Found: " + family.lastName); return new OkObjectResult(family); } [FunctionName("SearchByQuery")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "families/mother/{motherName}")]HttpRequestMessage req, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection", SqlQuery = "SELECT * FROM c Where c.parents[0].firstName = {motherName}")] IEnumerable<Family> families, ILogger log) { log.LogInformation("Found: " + families.Count()); return new OkObjectResult(families); } [FunctionName("SearchByDocumentClient")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "families/mother2/{motherName}")]HttpRequestMessage req, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection")] DocumentClient client, string motherName, ILogger log) { Uri collectionUri = UriFactory.CreateDocumentCollectionUri("demo", "family_100k"); IDocumentQuery<Family> families = client .CreateDocumentQuery<Family>(collectionUri, new FeedOptions { EnableCrossPartitionQuery = true}) .Where(p => p.parents[0].firstName == motherName) .AsDocumentQuery(); var result = new List<Family>(); while (families.HasMoreResults) { result.AddRange(await families.ExecuteNextAsync<Family>()); } log.LogInformation("Found: " + result.Count); return new OkObjectResult(result); }
Write access
[FunctionName("AddOneFamily")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = "families")]Family family, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection")] out dynamic documentDb, ILogger log) { documentDb = family; return new OkResult(); } [FunctionName("AddManyFamilies")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = "families/batch")]Family[] families, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection")] IAsyncCollector<Family> documentDb, ILogger log) { foreach (var family in families) { await documentDb.AddAsync(family); } return new OkResult(); } [FunctionName("UpdateOneFamily")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "put", Route = "family/{lastName}/{id}")]Family family, [CosmosDB( databaseName: "workshop", collectionName: "family_100k", ConnectionStringSetting = "CosmosDBConnection", PartitionKey = "{lastName}", Id = "{id}")] out dynamic document, string id, string lastName, ILogger log) { document = new { id = id, lastName = lastName, parents = family.parents, children = family.children, address = family.address, }; return new OkResult(); }