Search code examples
azure-cosmosdbazure-cosmosdb-mongoapi

Delete an item using DeleteItemAsync when PartitionKeyValue and id both values are same


I am trying to delete an item from CosmosDB collection. I am calling using

ItemResponse<Device> response = await _deviceCapabilityContainerName.DeleteItemAsync<Device>(device.deviceId, new PartitionKey(device.deviceId));

I have seen posts doing exactly the same only difference being, in my case both the values PartitionKey and id are same. I am constantly getting 404 Resource Not found error. How can I delete records in this case. I don't want to drop the collection and re-create.


Solution

  • Newest

    Data Format.

    {
    "id": "002",
    "deviceid": "002",
    "_rid": "Jx1nAMAZtRYEAAAAAAAAAA==",
    "_self": "dbs/Jx1nAA==/colls/Jx1nAMAZtRY=/docs/Jx1nAMAZtRYEAAAAAAAAAA==/",
    "_etag": "\"00000000-0000-0000-5a4b-b12502fe01d6\"",
    "_attachments": "attachments/",
    "_ts": 1594778419
    }
    

    enter image description here

    Code.

    using System;
    using System.Threading.Tasks;
    using System.Configuration;
    using System.Collections.Generic;
    using System.Net;
    using Microsoft.Azure.Cosmos;
    using System.Linq;
    
    namespace CosmosDB
    {
        class Program
        {
            // <Main>
            public static async Task Main(string[] args)
            {
                try
                {
                    Console.WriteLine("Beginning operations...\n");
                    CosmosClient client = new CosmosClient("https://localhost:8081/", "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==");
                    Database database = await client.CreateDatabaseIfNotExistsAsync("Items");
                    Container container = database.GetContainer("test");
                    // Query for an item
                    FeedIterator<response> feedIterator = container.GetItemQueryIterator<response>("SELECT * FROM c");
    
                    List<Task> concurrentDeleteTasks = new List<Task>();
    
                    while (feedIterator.HasMoreResults)
                    {
                        FeedResponse<response> res = await feedIterator.ReadNextAsync();
                        foreach (var item in res)
                        {                            concurrentDeleteTasks.Add(container.DeleteItemAsync<response>(item.id, new PartitionKey(item.deviceid)));
                        }
                    }
                    await Task.WhenAll(concurrentDeleteTasks.Take(3));
                }
                catch (CosmosException de)
                {
                    Exception baseException = de.GetBaseException();
                    Console.WriteLine("{0} error occurred: {1}", de.StatusCode, de);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Error: {0}", e);
                }    
                finally
                {
                    Console.WriteLine("End of demo, press any key to exit.");
                    Console.ReadKey();
                }
            }
            public class response
            {
                public string id { get; set; }
                public string deviceid { get; set; }
                public string _rid { get; set; }
                public string _self { get; set; }
                public string _etag { get; set; }
                public string _attachments { get; set; }
                public long _ts { get; set; }
                }
            }
        }
    

    PRIVIOUS

    Your error is that partion key is not name but value of the partion key.

    container.DeleteItemAsync<response>(item.id, new PartitionKey(item.adress)
    

    For more detail, you can refer my answer in this post.