Azure CosmosDB删除条目提示指定id实体不存在,应如何正确实现?
问题解决方法
你当前报错的核心原因是container.item()方法第二个参数传入的是分区键的配置定义,而非目标条目对应的分区键实际值,CosmosDB需要同时匹配id和分区键值才能定位到唯一条目,参数不匹配就会抛出实体不存在的错误。
相关概念说明
- 分区键路径:你创建容器时配置的
/requests,是指定容器划分数据分区时读取的字段路径,属于容器的全局配置 - 分区键值:单条数据中对应分区键路径的字段的实际取值,比如某条数据的
requests字段值为"20240601",这个值就是该条数据的分区键值
代码修改方案
你已经通过id查询到了目标条目,直接从查询结果中提取分区键值传入删除方法即可,修改后的代码如下:
async function findItemsToDelete(idToDelete){ const { endpoint, key, databaseId, containerId } = config; const client = new CosmosClient({ endpoint, key }); const database = client.database(databaseId); const container = database.container(containerId); const querySpec = { query: `SELECT * FROM c WHERE c.id = "${idToDelete}"` }; const { resources: items } = await container.items .query(querySpec) .fetchAll(); // 新增判断:查询到对应条目再执行删除 if(items.length > 0) { // 从查询到的条目里直接取分区键值,因你的分区键路径为/requests,对应字段为requests const targetPartitionValue = items[0].requests; const { resource: result } = await container.item(idToDelete, targetPartitionValue).delete(); console.log(`成功删除id为${idToDelete}的条目`); } else { console.log(`未找到id为${idToDelete}的条目`); } return items; }
额外注意事项
- 如果分区键是嵌套字段,比如路径是
/user/requests,就要对应取items[0].user.requests的值传入 - 不要直接传分区键路径或者分区键配置对象作为第二个参数,必须传目标数据的实际字段值
内容的提问来源于stack exchange,提问作者ac23
相关产品推荐
相关产品推荐

