Azure Cosmos Db 文档分区键具有重复项,但发现具有其他列组合的重复文档
Azure Cosmos Db document partition key having duplicate, but find duplicate document with combination of other columns
我有以下文档 JSON(粘贴了部分 JSON,实际 JSON 会很复杂并嵌入)。 JSON 的代码作为 ParitionKey,我正在尝试通过迁移我的 sql 表来构建 No SQL 数据库文档,我将有代码,类型制作唯一行,如下所示Code = 4 与我刚刚生成的 GUID 不同的类型和 id 重复(不确定 id 字段所以生成 GUID 并分配给它)。
我们只有两个类型字段的值,它是整个数据的 RI 或 NRI,并且代码像下面的示例数据一样重复 Code: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));
}
但是从上面 ReadItemAsync 参数中的代码,我怎么知道 id 参数,因为它是在每次插入时随机生成的 GUID,有没有更好的方法在插入 Cosmos DB 之前利用 id 属性,所以它可以在 ReadItemAsync 时使用 ?
第二个参数是 paritionKey,如果我将代码作为分区键,它不会按预期工作,因为代码可以用不同的“类型”值复制并且它是有效的,但代码和类型一起使它独一无二,我们如果代码和类型相同,则不应允许插入另一个文档。
如何在 Cosmos db 插入中执行此操作?我有以下问题:
- id 字段 --> 我可以生成 GUID 并保存文档或 id 字段有任何可在读取期间使用的用途吗?
- 是否可以选择一个可能有重复项的分区键,例如代码字段。
- 如何在使用上述限定符插入之前检查文档是否存在,因为代码文件可以复制,但只有类型才能使它唯一?
有什么建议吗?
如果代码和类型形成一个唯一的行,那么您也应该使用 type 的值作为 id,而不是生成 GUID,因为在 Cosmos DB 中,您的分区键和 id 的组合必须是唯一的。
然后当你执行插入时,如果数据已经存在,它会抛出一个你可以捕获的异常。对于读取,如果您知道代码和类型的值,则可以使用它们执行点读取以获取单行数据,而不是使用查询。这是在 Cosmos DB 中获取数据的最有效方式。
分区键值可以有重复项。您只需要确保每个分区键值的数据少于 20GB。
我有以下文档 JSON(粘贴了部分 JSON,实际 JSON 会很复杂并嵌入)。 JSON 的代码作为 ParitionKey,我正在尝试通过迁移我的 sql 表来构建 No SQL 数据库文档,我将有代码,类型制作唯一行,如下所示Code = 4 与我刚刚生成的 GUID 不同的类型和 id 重复(不确定 id 字段所以生成 GUID 并分配给它)。
我们只有两个类型字段的值,它是整个数据的 RI 或 NRI,并且代码像下面的示例数据一样重复 Code: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));
}
但是从上面 ReadItemAsync 参数中的代码,我怎么知道 id 参数,因为它是在每次插入时随机生成的 GUID,有没有更好的方法在插入 Cosmos DB 之前利用 id 属性,所以它可以在 ReadItemAsync 时使用 ?
第二个参数是 paritionKey,如果我将代码作为分区键,它不会按预期工作,因为代码可以用不同的“类型”值复制并且它是有效的,但代码和类型一起使它独一无二,我们如果代码和类型相同,则不应允许插入另一个文档。
如何在 Cosmos db 插入中执行此操作?我有以下问题:
- id 字段 --> 我可以生成 GUID 并保存文档或 id 字段有任何可在读取期间使用的用途吗?
- 是否可以选择一个可能有重复项的分区键,例如代码字段。
- 如何在使用上述限定符插入之前检查文档是否存在,因为代码文件可以复制,但只有类型才能使它唯一?
有什么建议吗?
如果代码和类型形成一个唯一的行,那么您也应该使用 type 的值作为 id,而不是生成 GUID,因为在 Cosmos DB 中,您的分区键和 id 的组合必须是唯一的。
然后当你执行插入时,如果数据已经存在,它会抛出一个你可以捕获的异常。对于读取,如果您知道代码和类型的值,则可以使用它们执行点读取以获取单行数据,而不是使用查询。这是在 Cosmos DB 中获取数据的最有效方式。
分区键值可以有重复项。您只需要确保每个分区键值的数据少于 20GB。