有人可以向我解释一下 upsert 方法背后的逻辑吗,因为我来自 SQL 世界,我不太明白为什么它没有按预期工作。
假设我有一个名为“产品”的容器。我将分区键设置为“category_id”。我还将唯一键设置为“sku”。
然后我想用container.items.upsert()方法存储这个对象:
const product= { sku: 1, name: "MyAwesomeProduct", category_id: 100 }
使用 upsert 的第一次迭代效果很好。现在,如果我想“插入或更新”产品并说我只需再次添加此产品,但将“name”的值更改为“UpdatedAwesomeProduct”并尝试更新插入它,Azure 将返回一个错误,指出具有相同内容的项目 key 已经存在。我只是想更新它的名字。是否需要先查询带有sku的商品,然后再决定是否单独创建或更新?
最佳答案
关键是首先了解什么是商品标识。
在 Cosmos DB 中,项目标识是 id
和分区键。
如果我更新插入具有 id
A 和分区键 X
的项目,并且之前不存在具有此 id
和分区的其他项目键,然后它将被创建。
如果我使用相同的 id
和分区键再次调用 Upsert 并进行其他一些属性更改,则该项目将被更新/替换。
在您的示例中,您的 product
没有 id
,因此可能发生的情况是 id
自动生成为 指南
。
因此调用两次,将生成 2 个不同的项目。
但是,您的第二次更新插入失败的原因是您的唯一 key 。唯一键约束意味着在一个分区键中,没有 2 个项目可以具有相同的唯一键值,因此在 category_id
100
中不能有 2 个项目带有 sku
1
的商品。由于您的 Upsert 未指定 id
并让它自动生成,因此它会尝试创建第二个文档,并且未通过唯一键违规。
关于node.js - azure cosmosdb 中的更新插入功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76237083/