从 cosmos 中删除数据时出现分区键错误

问题描述 投票:0回答:1

更新

我正在尝试使用 c# 从 cosmos 移动数据。代码正在读取 cosmos 中的所有数据(大约 70k)。我希望复制到 blob 并从 cosmos 中删除。 但我收到错误:

错误

Entity with the specified id does not exist in the system.
但我可以看到它在那里,因为我在阅读代码后使用相同的文档。

我也检查过 如何在不知道分区键值的情况下从 Cosmos DB 中删除对象?

虽然我可以在cosmos中看到我有一个分区键“/content.provider.id”。 我怎样才能使用这个分区键来删除.

            foreach (Document document in item)


            {
                var content = document.ToString();
                var json = JsonConvert.DeserializeObject(content);
                string blobId = String.Concat(document.Id);
                using (Stream ms = new MemoryStream(Encoding.UTF8.GetBytes(json.ToString().ToCharArray())))
                {
                    try
                    {
                        await (ConnectionFactory.GetConnectionBlob(DestinationStorageContainerName, storageConnectionString)).GetBlobClient(blobId).UploadAsync(ms, true);
                        

                        await (ConnectionFactory.GetConnectionDocumentClient(cosmosAccount, cosmosKey)).DeleteDocumentAsync(
         UriFactory.CreateDocumentUri(SourceCosmosDatabaseName, SourceCosmosCollectionName, document.Id),
         new RequestOptions() { PartitionKey = new PartitionKey(Undefined.Value) });



                        Console.WriteLine("All files copied to Storage - " + count);
                        count++;
                    }
                    catch (CosmosException ce)
                    {
                        Console.WriteLine(ce.Message);
                        Console.WriteLine("data Coped" + count);
                    }


                }
            }
c# .net azure azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票

我希望复制到 blob 并从 cosmos 中删除。

以下是我从 Cosmos 中删除并将其存储在 Blob 中的步骤:

  • 使用提供的 Cosmos DB 配置,

    CosmosClient
    创建 Cosmos DB 客户端。

  • 使用

    ReadItemAsync
    函数从 Cosmos DB 读取文档。

  • 文档由其 分区键

    cosmosDbItemIdToDelete
    标识。

  • 分区键的值作为输入传递给

    PartitionKey
    构造函数。我在代码中使用了文档的Id作为分区键值。

  • 使用分区键来识别文档所在的正确分区。这可确保从正确的分区中删除文档。

  • cosmosDbItemIdToDelete
    用作分区键值来定位并删除相应分区内的文档。

  • Blob 存储的

    BlobServiceClient
    BlobContainerClient
    是使用 Azure Blob 存储 SDK 和提供的配置创建的。

  • Cosmos DB 文档中的数据被序列化为必要的格式,并使用给定的

    blobFileName
    上传到 Azure Blob 存储。

  • 使用

    DeleteItemAsync()
    方法删除从 Cosmos DB 复制到 Blob 存储的文档。

下面是我尝试过的代码:

static async Task Main()
{
    string cosmosDbEndpoint = "*****";
    string cosmosDbKey = "*****";
    string cosmosDbDatabaseName = "newDb";
    string cosmosDbContainerName = "newCont";
    string cosmosDbItemIdToDelete = "1";

    string blobStorageConnectionString = "*****";
    string blobContainerName = "balaji";
    string blobFileName = "balajiDoc.txt";
    
    Console.WriteLine("Starting the data transfer and deletion process...");

    try
    {
        using CosmosClient cosmosClient = new CosmosClient(cosmosDbEndpoint, cosmosDbKey);
        Database cosmosDatabase = cosmosClient.GetDatabase(cosmosDbDatabaseName);
        Microsoft.Azure.Cosmos.Container cosmosContainer = cosmosDatabase.GetContainer(cosmosDbContainerName);

        ItemResponse<MyDocument> cosmosResponse = await cosmosContainer.ReadItemAsync<MyDocument>(
            cosmosDbItemIdToDelete,
            new PartitionKey(cosmosDbItemIdToDelete));

        Console.WriteLine("Document read from Cosmos DB.");

        BlobServiceClient blobServiceClient = new BlobServiceClient(blobStorageConnectionString);
        BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient(blobContainerName);
        BlobClient blobClient = blobContainerClient.GetBlobClient(blobFileName);

        using Stream stream = new MemoryStream(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(cosmosResponse.Resource)));
        await blobClient.UploadAsync(stream, true);

        Console.WriteLine("Document data copied to Azure Blob Storage.");

        await cosmosContainer.DeleteItemAsync<MyDocument>(
            cosmosDbItemIdToDelete,
            new PartitionKey(cosmosDbItemIdToDelete));

        Console.WriteLine("Document deleted from Cosmos DB.");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"An error occurred: {ex.Message}");
    }
}

输出:

在控制台中:

Starting the data transfer and deletion process...
Document read from Cosmos DB.
Document data copied to Azure Blob Storage.
Document deleted from Cosmos DB.

在斑点中:

{"Id":"1","Name":"Pavan","Age":25}
© www.soinside.com 2019 - 2024. All rights reserved.