Удалите элемент с помощью DeleteItemAsyn c, когда значения PartitionKeyValue и id совпадают - PullRequest
1 голос
/ 14 июля 2020

Я пытаюсь удалить элемент из коллекции CosmosDB. Я звоню, используя

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

. Я видел сообщения, делающие то же самое, с той лишь разницей, что в моем случае значения PartitionKey и id одинаковы. Я постоянно получаю сообщение об ошибке 404: ресурс не найден. Как я могу удалить записи в этом случае. Я не хочу отбрасывать коллекцию и создавать заново.

1 Ответ

1 голос
/ 14 июля 2020

Новые

Формат данных.

{
"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
    {
        // 
        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 feedIterator = container.GetItemQueryIterator("SELECT * FROM c");

                List concurrentDeleteTasks = new List();

                while (feedIterator.HasMoreResults)
                {
                    FeedResponse res = await feedIterator.ReadNextAsync();
                    foreach (var item in res)
                    {                            concurrentDeleteTasks.Add(container.DeleteItemAsync(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(item.id, new PartitionKey(item.adress)

For more detail, you can см. Мой ответ в этом посте .

...