如何使用 SQL API 更改 CosmosDB 中文档的结构
How to change the structure of a document in CosmosDB using the SQL API
如何在使用 SQL API 时更改 CosmosDB 中一个或一组文档的结构?
例如,你应该如何改变:
{
"id": "some-id",
"StudentId": "some@email.address",1
// etc.
对此:
{
"id": "some-id",
"StudentEmail": "some@email.address",
// etc.
值得注意的是,经常用于更改数据库中项目结构的词是 "migration"。但是,在 CosmosDB 文献中,该词似乎仅用于将数据移动到 CosmosDB 数据库的行为。
所以Cosmos DB SQL API
不支持部分文档更新。您需要 replace
整个文档。您需要做的是获取文档,进行更改,然后替换项目。
您可以在此处找到相同的示例代码:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/ItemManagement/Program.cs。来自同一个 link,这里是替换文档的代码:
private static async Task ReplaceItemAsync(SalesOrder order)
{
//******************************************************************************************************************
// 1.5 - Replace a item
//
// Just update a property on an existing item and issue a Replace command
//******************************************************************************************************************
Console.WriteLine("\n1.5 - Replacing a item using its Id");
order.ShippedDate = DateTime.UtcNow;
ItemResponse<SalesOrder> response = await container.ReplaceItemAsync(
partitionKey: new PartitionKey(order.AccountNumber),
id: order.Id,
item: order);
SalesOrder updated = response.Resource;
Console.WriteLine($"Request charge of replace operation: {response.RequestCharge}");
Console.WriteLine($"Shipped date of updated item: {updated.ShippedDate}");
order.ShippedDate = DateTime.UtcNow;
using (Stream stream = Program.ToStream<SalesOrder>(order))
{
using (ResponseMessage responseMessage = await container.ReplaceItemStreamAsync(
partitionKey: new PartitionKey(order.AccountNumber),
id: order.Id,
streamPayload: stream))
{
// Item stream operations do not throw exceptions for better performance
if (responseMessage.IsSuccessStatusCode)
{
SalesOrder streamResponse = FromStream<SalesOrder>(responseMessage.Content);
Console.WriteLine($"\n1.5.2 - Item replace via stream {streamResponse.Id}");
}
else
{
Console.WriteLine($"Replace item from stream failed. Status code: {responseMessage.StatusCode} Message: {responseMessage.ErrorMessage}");
}
}
}
}
替换时,请记住 id
和 partition key
值不应更改。如果任何值更改,将创建一个新文档。
如何在使用 SQL API 时更改 CosmosDB 中一个或一组文档的结构?
例如,你应该如何改变:
{
"id": "some-id",
"StudentId": "some@email.address",1
// etc.
对此:
{
"id": "some-id",
"StudentEmail": "some@email.address",
// etc.
值得注意的是,经常用于更改数据库中项目结构的词是 "migration"。但是,在 CosmosDB 文献中,该词似乎仅用于将数据移动到 CosmosDB 数据库的行为。
所以Cosmos DB SQL API
不支持部分文档更新。您需要 replace
整个文档。您需要做的是获取文档,进行更改,然后替换项目。
您可以在此处找到相同的示例代码:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/ItemManagement/Program.cs。来自同一个 link,这里是替换文档的代码:
private static async Task ReplaceItemAsync(SalesOrder order)
{
//******************************************************************************************************************
// 1.5 - Replace a item
//
// Just update a property on an existing item and issue a Replace command
//******************************************************************************************************************
Console.WriteLine("\n1.5 - Replacing a item using its Id");
order.ShippedDate = DateTime.UtcNow;
ItemResponse<SalesOrder> response = await container.ReplaceItemAsync(
partitionKey: new PartitionKey(order.AccountNumber),
id: order.Id,
item: order);
SalesOrder updated = response.Resource;
Console.WriteLine($"Request charge of replace operation: {response.RequestCharge}");
Console.WriteLine($"Shipped date of updated item: {updated.ShippedDate}");
order.ShippedDate = DateTime.UtcNow;
using (Stream stream = Program.ToStream<SalesOrder>(order))
{
using (ResponseMessage responseMessage = await container.ReplaceItemStreamAsync(
partitionKey: new PartitionKey(order.AccountNumber),
id: order.Id,
streamPayload: stream))
{
// Item stream operations do not throw exceptions for better performance
if (responseMessage.IsSuccessStatusCode)
{
SalesOrder streamResponse = FromStream<SalesOrder>(responseMessage.Content);
Console.WriteLine($"\n1.5.2 - Item replace via stream {streamResponse.Id}");
}
else
{
Console.WriteLine($"Replace item from stream failed. Status code: {responseMessage.StatusCode} Message: {responseMessage.ErrorMessage}");
}
}
}
}
替换时,请记住 id
和 partition key
值不应更改。如果任何值更改,将创建一个新文档。