使用 c# .Net 客户端 SDK,我调用 ExecuteStoredProcedureAsync 方法如下:
sproc_response = await client.ExecuteStoredProcedureAsync<Document>(sproc_uri, new RequestOptions { PartitionKey = new PartitionKey( my_partition_key) }, doc_to_create );
存储过程代码如下:
sproc.Body = @"function( doc ) {
var collection = getContext().getCollection();
var response = getContext().getResponse();
function create_doc_callback( err, doc_created, options ) {
if(err) throw new Error('Error creating document: ' + err.message);
response.setBody( doc_created );
}
collection.createDocument( collection.getSelfLink(), doc, {}, create_doc_callback );
}";
这总是导致抛出以下异常:
创建文档时出错:来自脚本的请求不能引用除提交客户端请求的分区键之外的分区键。
是否有任何文档或示例清楚地显示了如何使用分区键调用存储过程——显然,我遗漏了一些东西!
最佳答案
在 Cosmos 中创建分区集合时,您需要选择一个分区键,该键是文档的 JSON 表示中的路径,用于将文档放置在正确的分区中。如果您试图插入一个没有分区键的文档,它将被分组到一个特殊的分区,用于没有分区键的文档。您指定存储过程应在给定分区的上下文中运行,但随后尝试使用它来将文档插入不同的分区(未定义的分区)。确保您的 POCO 上有一个属性,该属性映射到您为集合中的分区键选择的值。
当您在 RequestOptions 中为 PartitionKey 传递一个值时,您清楚地知道要将文档放入哪个分区。现在确保您的 POCO 在与您在创建集合时选择的分区键匹配的属性上包含此值。如果您不提供 ID,该文档仍将具有自动生成的 ID。或者,您可以在处理动态 JS 对象时将分区键添加到 Sproc 内的文档中。
doc.partitionKey = my_partition_key
关于.net - Azure DocumentDB - 源自脚本的请求不能引用除提交客户端请求的分区键之外的分区键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44830792/