Azure DocumentDB - 源自脚本的请求不能引用除提交客户端请求的分区密钥之外的分区密钥

bdc*_*der 4 .net azure-cosmosdb

使用c#.Net客户端SDK,我调用ExecuteStoredProcedureAsync方法,如下所示:

sproc_response = await client.ExecuteStoredProcedureAsync<Document>(sproc_uri, new RequestOptions { PartitionKey = new PartitionKey( my_partition_key) }, doc_to_create );
Run Code Online (Sandbox Code Playgroud)

存储过程代码如下:

     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 );

        }";
Run Code Online (Sandbox Code Playgroud)

此ALWAYS导致抛出以下异常:

创建文档时出错:源自脚本的请求不能引用除提交客户端请求的分区密钥之外的分区密钥.

是否有任何文档或示例清楚地显示如何使用分区键调用存储过程 - 显然,我遗漏了一些东西!

Jes*_*ter 7

在Cosmos中创建分区集合时,您需要选择一个分区键,该键是文档的JSON表示形式中的路径,用于将文档放在正确的分区中.如果您尝试插入没有分区键的文档,它将被分组到一个特殊分区中,用于没有分区键的文档.您指定存储过程应该在给定分区的上下文中运行,然后尝试使用它将文档插入到不同的分区(未定义的分区).确保您的POCO上有一个属性,该属性映射到您为集合中的分区键选择的值.

当您在PartitionKey的RequestOptions中传递值时,您清楚地知道要放置文档的分区.现在,请确保您的POCO在与您在创建集合时选择的分区键匹配的属性中包含此值.如果您不提供,则文档仍将具有自动生成的ID.或者,您可以在处理动态JS对象时将分区键添加到Sproc内的文档中.

doc.partitionKey = my_partition_key
Run Code Online (Sandbox Code Playgroud)