Azure门户执行Cosmos DB存储过程删除集合文档无记录删除问题
问题排查与解决步骤
这个问题90%以上是由Cosmos DB存储过程的运行机制导致的,可按以下顺序排查:
- 检查存储过程调用时的分区键配置
Cosmos DB的存储过程默认仅运行在单个逻辑分区上,调用时如果没有指定正确的分区键值,存储过程只会扫描指定分区内的文档,如果待删除的type = 'ORDER'文档不在该分区内,就会出现retrievedDocs.length为0的情况。
解决方法:- 如果你的容器分区键为
/type,调用存储过程时直接将分区键值填为ORDER即可 - 如果分区键为其他字段,需要在外部遍历所有分区键的取值,逐个作为参数调用存储过程,或者在查询中加入分区键过滤条件,每次调用对应分区的键值
- 如果你的容器分区键为
- 验证传入的查询语句是否正确
存储过程接收的参数可能存在转义异常,你可以在存储过程逻辑开头添加日志输出:
执行存储过程后查看运行日志,确认传入的查询语句和你在Azure门户手动执行的console.log("接收到的查询语句:", query)SELECT c._self FROM c WHERE c.type = 'ORDER'完全一致,没有引号丢失、转义错误的问题。 - 调整查询的一致性级别
存储过程默认使用的一致性级别可能和门户查询的一致性级别不同,若你刚写入待删除的文档,可能存在最终一致性同步延迟导致查询不到。可以修改tryQueryAndDelete方法中的请求配置,强制指定一致性级别:var requestOptions = { continuation: continuation, consistencyLevel: "Strong" }; - 检查存储过程权限配置
确认存储过程的访问权限没有被限制为只读,默认情况下存储过程会继承当前调用者的权限,你可以使用具备容器读写权限的账号重新调用测试。
内容的提问来源于stack exchange,提问作者user2233706
相关产品推荐
相关产品推荐

