Azure DocumentDB - 源自脚本的请求不能引用提交客户端请求的分区键以外的分区键



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

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 上有一个属性,该属性映射到你为集合上的分区键选择的值。

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

doc.partitionKey = my_partition_key