【问题标题】:IDocumentClient.UpsertDocumentAsync doesn't update, it inserts duplicated idsIDocumentClient.UpsertDocumentAsync 不会更新,它会插入重复的 id
【发布时间】:2018-02-13 21:42:08
【问题描述】:

我在 C# 中有一个 VS2017 解决方案,我正在使用 IDocumentClient.UpsertDocumentAsync 将一些文档 Upsert 到我的 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”的定义。如果有人能为我澄清这一点,将不胜感激。

【问题讨论】:

  • 你正在更新插入的对象模型是什么样的?
  • 你的分区键是什么?两个文档的值是否不同?
  • @AravindKrishnaR。是的,实际上删除的字段(年龄)是分区键。
  • 谢谢。我想我明白发生了什么。把答案贴在下面。
  • @DeveloperInToronto 有什么更新吗?

标签: c# azure azure-cosmosdb upsert


【解决方案1】:

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

所以在这种情况下,您有两个文档,一个带有 [age="35", "aaaa-bbbb-cccc"],另一个带有由 upsert 调用创建的 [age=undefined, "aaaa-bbbb-cccc"]。如果您将 upsert 调用更改为替换,您将收到 NotFound 错误。

【讨论】:

    【解决方案2】:

    我对这种行为感到很困惑;也许我不正确 理解“upsert”的定义。

    如果文档不存在,Azure Cosmos DB 中的Upsert 操作将创建一个文档,否则将其覆盖。 “Should I use a Create or a Replace operation?”,数据库为您做出这个决定。这为您节省了额外的请求单元费用,并且由于操作是原子的,因此消除了竞争条件的可能性。

    然而,cosmos db 只是保证了idpartition key 的唯一性。

    示例:

    [
      {
        "id": "1",
        "name": "jay1"
      },
      {
        "id": "1",
        "name": "jay2"
      },
      {
         "id": "1"
      }
    ]
    

    partition-key 是name 。Partition-key 用于分片,它充当数据的逻辑分区,并为 Cosmos DB 提供跨分区分布数据的自然边界。以上3个文档有不同的分区:"jay1","jay2",None,所以id属性在各自的逻辑分区中是唯一的。现在,如果您使用Upsert 方法将具有相同id 的文档添加到各自的分区中,您将覆盖之前的文档。

    您可以参考文档:Unique keys in Azure Cosmos DBPartition and scale in Azure Cosmos DB

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 2014-06-26
      • 1970-01-01
      • 2017-01-22
      • 1970-01-01
      • 2018-02-06
      • 2012-12-22
      • 1970-01-01
      • 2016-03-20
      相关资源
      最近更新 更多