更新
我正在尝试使用 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);
}
}
}
我希望复制到 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}