Azure Function用DocumentClient删除CosmosDB项需提供PartitionKey如何解决
问题解决方法
报错原因
你遇到的PartitionKey value must be supplied for this operation.报错是因为Cosmos DB的点操作(包括删除、替换单条文档)要求必须显式指定文档对应的分区键值,避免跨分区扫描消耗额外的RU。
代码修改方案
根据你当前的场景,分两种情况处理:
情况1:待删除文档包含testCategory字段
你可以直接从查询得到的document对象中提取分区键值,传入删除方法的配置项即可:
await client.DeleteDocumentAsync(document.SelfLink, new RequestOptions { PartitionKey = new Microsoft.Azure.Documents.PartitionKey(document.GetPropertyValue<string>("testCategory")) } );
情况2:待删除文档没有testCategory字段(即你给出的示例数据场景)
如果插入数据时没有传入分区键对应字段,Cosmos DB会自动将这类文档的分区键归类为Undefined,删除时直接传入内置的PartitionKey.None即可:
await client.DeleteDocumentAsync(document.SelfLink, new RequestOptions { PartitionKey = Microsoft.Azure.Documents.PartitionKey.None } );
优化建议(可选)
你当前的实现是先跨分区查询得到文档再执行删除,性能较差、消耗RU更高。建议你在删除请求的Body中同时传入id和对应的testCategory值,先修改Item类:
public class Item{ public string id {get; set;} // 新增分区键字段 public string testCategory {get; set;} }
删除时直接使用请求中传入的分区键值,无需从查询结果中提取:
await client.DeleteDocumentAsync(document.SelfLink, new RequestOptions { PartitionKey = new Microsoft.Azure.Documents.PartitionKey(updated.testCategory) } );
注意:代码中的
RequestOptions首字母O为大写,拼写错误会导致编译失败。
容器配置调整建议
你当前容器的分区键为/testCategory,但存储的示例数据中没有该字段,所有数据都会被分配到同一个Undefined逻辑分区中,数据量超过10GB后会无法写入,且查询、写入性能都会受影响。如果业务场景中确实不会用到testCategory字段,建议你根据实际访问场景重新选择分区键(比如按用户维度选/Email、按id查询多可选/id),但注意Cosmos DB容器创建后分区键无法修改,需要新建容器迁移存量数据。
内容的提问来源于stack exchange,提问作者pcghose
相关产品推荐
相关产品推荐

