首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用SQL在CosmosDB中更改文档的结构

如何使用SQL在CosmosDB中更改文档的结构
EN

Stack Overflow用户
提问于 2020-03-19 09:01:37
回答 1查看 853关注 0票数 0

在使用SQL时,如何更改CosmosDB中文档或文档集的结构?

例如,您应该如何改变这种情况:

代码语言:javascript
复制
{
    "id": "some-id",
    "StudentId": "some@email.address",1
    // etc.

对此:

代码语言:javascript
复制
{
    "id": "some-id",
    "StudentEmail": "some@email.address",
    // etc.

值得注意的是,经常用于更改数据库中项的结构的一个词是“迁移”。然而,在CosmosDB文献中,这个词似乎只用于将数据移动到CosmosDB数据库的行为。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 09:36:19

因此,Cosmos DB SQL API不支持部分文档更新。您需要对整个文档进行replace。您需要做的是获取文档,进行更改,然后替换项目。

您可以在这里找到相同的示例代码:https://github.com/Azure/azure-cosmos-dotnet-v3/blob/master/Microsoft.Azure.Cosmos.Samples/Usage/ItemManagement/Program.cs。在相同的链接中,下面是替换文档的代码:

代码语言:javascript
复制
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}");
            }
        }
    }
}

在替换时,请记住idpartition key值都不应更改。如果任何值发生变化,将创建一个新文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60753820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档