node.js - azure cosmosdb 中的更新插入功能

标签 node.js azure azure-cosmosdb

有人可以向我解释一下 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/

相关文章:

javascript - Nodejs Handlebars 如何运行服务器端 javascript

node.js - 如何在远程方法中访问 "current logged-in user"?

azure - 克隆 Azure 仪表板并调整 ApplicationInsights 磁贴

c# - 我可以为无服务器 Azure Cosmos DB 动态创建表(Azure 表)吗?

node.js - Express.js 项目中在哪里进行验证 – 数据库层验证(re. Mongoose)?

azure - 如何查看对预测结果影响最大的列?

Windows Azure 移动服务多次插入,如何获取范围标识

javascript - 如何根据条件从 COSMOS DB 中选择记录

database - 从 Azure Cosmos DB 导出数据(其中类型为 MongoDB API)

node.js - Sequelize - 如果与另一个模型存在关系,我如何 "select"模型的实例