Azure cosmosdb Azure Cosmos Db文档分区键具有重复项,但找到具有其他列组合的重复文档

Azure cosmosdb Azure Cosmos Db文档分区键具有重复项,但找到具有其他列组合的重复文档,azure-cosmosdb,azure-cosmosdb-sqlapi,Azure Cosmosdb,Azure Cosmosdb Sqlapi,我有下面的JSON文档(粘贴的部分JSON,实际的JSON将是复杂的和嵌入的)。JSON将代码作为PARTIONKEY,我正试图通过迁移我的SQL表来构建任何SQL数据库文档,我将使用代码,类型使行唯一,正如您在下面看到的,代码=4与我刚才生成的GUID(不确定id字段上是否生成了GUID并分配给它)的不同类型和id重复 对于类型字段,我们只有两个值,对于整个数据,它是RI或NRI,代码是重复的,如下面的示例数据代码:4,但类型和代码字段的组合使其唯一 JSON示例: { "id&q

我有下面的JSON文档(粘贴的部分JSON,实际的JSON将是复杂的和嵌入的)。JSON将代码作为PARTIONKEY,我正试图通过迁移我的SQL表来构建任何SQL数据库文档,我将使用代码,类型使行唯一,正如您在下面看到的,代码=4与我刚才生成的GUID(不确定id字段上是否生成了GUID并分配给它)的不同类型和id重复

对于类型字段,我们只有两个值,对于整个数据,它是RI或NRI,代码是重复的,如下面的示例数据代码:4,但类型和代码字段的组合使其唯一

JSON示例:

{
 "id" : "88725628-2a9a-4fc7-90ed-29c5ffbd45fa"
 "Code": "4",
 "Type": "RI",
 "Description": "MAC/CHEESE ",
},
{
 "id" : "88725628-9a3b-4fc7-90ed-29c5ffbd34sk"
 "Code": "8",
 "Type": "RI",
 "Description": "Cereals",
},
{
 "id" : "88725628-6d9f-4fc7-90ed-29c4ffbd87de"
 "Code": "4",
 "Type": "NRI",
 "Description": "Christmas Deal",
}
  
在NoSQL cosmos document db中,我无法使用两列作为分区键,因此我只有代码作为分区键,但当我尝试插入cosmos db时,如何检查是否不存在,然后仅插入,否则我将创建重复的文档:

CreateItemAsync-->我需要一种方法来检查文档是否已存在,如果不存在,则创建

我有下面的代码检查,如果没有找到创建项目

try
{
  // Read the item to see if it exists.  
  ItemResponse<Item> itemResponse = await this.container.ReadItemAsync<Item>(itm.Id, new PartitionKey(itm.Code));
                
}
catch (CosmosException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
  // Create an item in the container representing the Andersen family. Note we provide the value of the partition key for this item, which is "Andersen"
  ItemResponse<Item> itemResponse = await this.container.CreateItemAsync<Item>(itm, new PartitionKey(itm.Code));                       
}
试试看
{
//阅读该项以查看它是否存在。
ItemResponse ItemResponse=等待this.container.ReadItemAsync(itm.Id,new PartitionKey(itm.Code));
}
当(ex.StatusCode==HttpStatusCode.NotFound)时捕获(CosmosException ex)
{
//在容器中创建一个代表Andersen系列的项。注意,我们为该项提供了分区键的值,即“Andersen”
ItemResponse ItemResponse=等待this.container.CreateItemAsync(itm,新分区键(itm.Code));
}
但从上面ReadItemAsync参数中的代码中,我如何知道id参数,因为它是在每次插入时随机生成的GUID,是否有更好的方法在插入Cosmos DB之前利用id属性,以便在ReadItemAsync时可以利用它

第二个参数是PARTIONKEY,如果我将代码作为分区键,它将不会像预期的那样工作,因为代码可以使用不同的“类型”值进行复制,并且它是有效的,但是代码和类型一起使它唯一,如果代码和类型相同,我们不应该允许插入另一个文档

在Cosmos db insert中如何执行此操作?我有以下问题:

  • id字段-->我是否可以生成GUID并保存文档或id字段,以便在读取过程中使用
  • 可以选择一个分区键,它可能有重复项,比如代码字段
  • 在插入之前,如何使用上述限定符检查文档是否存在,因为代码字段可以重复,但只有使用类型才能使其唯一

  • 有什么建议吗?

    如果代码和类型是唯一的行,那么您也应该为id使用类型的值,而不是生成GUID,因为在Cosmos DB中,分区键和id的组合必须是唯一的

    然后,当您执行插入时,如果数据已经存在,它将抛出一个您可以捕获的异常。对于读取,如果您知道代码和类型的值,则可以使用它们执行点读取以获取单行数据,而不是使用查询。这是在Cosmos DB中获取数据的最有效方法


    分区键值可以有重复项。您只需要确保每个分区键值的数据少于20GB。

    谢谢标记,您的意思是id应该是“itemCode”或“ScanCode”,代码应该是上面示例数据中的4,4,8值吗?如果我对id字段使用“itemCode”或“ScanCode”,id将具有重复值,这样做可以吗?我误解了你的数据。我认为“扫描代码”或“项目代码”正在取代实际值。如果/type只有两个值,那么这将不起作用。让我更新我的回答。实际上,在重新阅读您的问题后,如果您确实希望/code和/type的组合是唯一的,那么我的建议是正确的。标记,type字段只有两个值,更新问题后,它将是RI或NRI,但代码是重复的,那么您是否建议我将Id字段作为类型和代码的组合,例如:Id:“RI8”,Id:“RI4”,Id:“NRI4”?对于id来说,使用只有两个值的属性很奇怪。也许更好的选择是键入分区键并对id进行编码。在任何一种情况下,分区键和id的组合都保证对集合是唯一的。如果您想将类型和代码组合到一个字段中,并将该值用于同一行的分区键和id,那么您实际上是在建模一个键值存储,它也可以很好地工作,也可以轻松地与ReadItemAsync()一起使用。