c# - IDocumentClient.UpsertDocumentAsync 不更新,它插入重复的 id

标签 c# azure azure-cosmosdb upsert

我有一个 C# 版本的 VS2017 解决方案,我正在使用 IDocumentClient.UpsertDocumentAsync 将一些文档更新插入到我的 cosmosdb documentdb 集合中。但我注意到它实际上是在创建具有相同 id 的新文档,而集合中已经存在具有该 id 的文档。

现在,在更新插入具有相同 id 的新文档后,查询结果如下所示:

select * from c where c.id = "aaaa-bbbb-cccc"

[
    {
        "id": "aaaa-bbbb-cccc",
        "firstname": "john",
        "lastname": "doe"
    },
    {
        "id": "aaaa-bbbb-cccc",
        "firstname": "john",
        "lastname": "doe",
        "age": "35"
    }
]

我对这种行为很困惑;也许我没有正确理解“upsert”的定义。如果有人能为我澄清这一点,我将不胜感激。

最佳答案

在 Cosmos DB 中,“id”不是唯一值。相反,它是唯一的分区键(在您的情况下为“age”)和“id”的组合。 Cosmos DB 允许分区键不存在(因为它对架构比较宽松),并将缺失的分区键值视为特殊值(=“未定义”)。分区键值也是不可变的 - 要更改这些值,您需要删除/插入。

因此,在本例中,您有两个文档,一个包含 [age="35", "aaaa-bbbb-cccc"],另一个包含 [age=undefined, "aaaa -bbbb-cccc"] 由 upsert 调用创建。如果您将 upsert 调用更改为替换,您将收到 NotFound 错误。

关于c# - IDocumentClient.UpsertDocumentAsync 不更新,它插入重复的 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48776123/

相关文章:

c# - 将 ServiceStack ICacheClient 与 Redis 和 Ninject 结合使用

azure-functions - Azure 函数上的 CosmosDBTrigger 无租约收集

asp.net - Azure WebJob 超时配置设置

azure - 如何使用 MongoDB API 将 Azure Databricks 连接到 Cosmos DB?

json - 将 JSON 数据从 DocumentDB(或 CosmosDB)移动到 Azure Data Lake

c# - 为什么我不能使用扩展方法隐式转换委托(delegate)?

c# - 如何在 Windows 8.1 中使用 SettingsFlyout 的完整高度和宽度

c# - JSON 反序列化为构造的 protected setter 数组

azure - 固定大小的存储桶 - 嵌套 JSON 数组

azure - 允许我的 Azure 应用服务与我的 Azure 虚拟机对话的最佳实践/方法