c# - 避免 CosmosDB 中的 UpsertAsync - 运行更新 SQL 命令

标签 c# azure azure-cosmosdb azure-cosmosdb-sqlapi

我在 Cosmos 集合中具有以下结构(该结构不会更改)

{
    "attribute1": "",
    "attribute2": "",
    "attribute3": "11181",
    "attribute4": "Text value",
    "companies": [
        {
            "companyId": "Guid",
            "companyName": "Value"
        }
    ],
    "id": "ec4c18d9-178d-43d4-a2b0-093b160bfd06"
}

我有一个修改公司列表的流程

有没有办法在 Cosmos 中运行“UPDATE”语句来仅更新公司列表?

下面显示的当前实现需要 1 分钟,这比我想要的要长得多

public void RandomizeCompanies()
{
  foreach (var item in _items)
  {
      //Clear companies list and add random elements to the list
  }
}

public async Task ChangeCompaniesAsync()
{
    await ConnectToDatabaseAsync();
    await GetItemsFromCosmosAsync().ConfigureAwait(false);
    RandomizeCompanies();

    try
    {
        Console.WriteLine($"Starting...");
        var stopwatch = Stopwatch.StartNew();
        var tasks = new List<Task>(_items.Count);

        foreach (var item in _items)
        {
            tasks.Add(_cosmosConnection.Container.UpsertItemAsync(item, new PartitionKey(item.Id)));
        }
        await Task.WhenAll(tasks);
        stopwatch.Stop();

        Console.WriteLine($"Finished writing {_items.Count} items in {stopwatch.Elapsed}.");
    }
    catch (Exception ex)
    {
         Console.WriteLine(ex);
    }
    finally
    {
        Console.WriteLine("Cleaning up resources...");
    }
  }
}

类似的东西

var tasks = new List<Task>(_items.Count);
foreach (var item in _items)
{
    tasks.Add( Run update statement that updates companies list to be items.Companies  );
}
await Task.WhenAll(tasks);

当前的实现并不理想,因为我正在序列化所有文档,即使只更改了一小部分。

最佳答案

正如另一个答案中所述,当前不支持部分更新。然而,即使一旦支持,这也很可能不会像您设计模型来将静态数据与频繁更改的数据分开那样有效。对于具有深层嵌套结构的大文档尤其如此。下面的这些建模建议包括使用“type”属性来区分实体类型,并使用共享的“分区键”和“id”,以便可以一起查询它们。有两个主要场景需要考虑。

场景 1(静态属性和频繁更新的属性):在此场景中,您拥有大量静态属性和少量频繁更新的属性。在此场景中,将静态属性建模为单个文档,并将频繁更新的属性建模为具有相同分区键和 ID 的第二个(较小的)文档。如果它不更小,则更频繁地与更新频率较低的属性分开。

场景 2(静态属性和无界数组中的属性):在这种场景中,您拥有相同的大量静态属性,但数组中的属性列表不断增长。这不必是特别无界的,但是当您有一个通常保持增长的数组时,将数组中的每个元素作为具有共享分区键和 id 的自己的文档,然后简单地插入到容器中会更有效。 p>

有关其中一些概念的更多信息,请参阅 Data modeling in Azure Cosmos DB

希望这对您有所帮助。

关于c# - 避免 CosmosDB 中的 UpsertAsync - 运行更新 SQL 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61305123/

相关文章:

c# - 使用 LINQ 将 List<dynamic> 转换为 List

java - 在 Azure 中创建空 CloudBlockBlob

sql - VSTS-Build for SQL Server 项目不起作用

azure - 使用数据工厂从 cosmos db 作为源进行复制事件时出错

c# - 远程调用永不返回

c# - .net6 需要完全限定的类名吗?

node.js - 如何从azure云中的nodejs应用程序发送gmail?

azure-cosmosdb - Cosmos DB 中的更改数据捕获

azure - 通过子网连接 CosmosDB 并定义相应的连接字符串

c# listview 类 - 锁定调整列大小的可能性