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

标签 .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 );

存储过程代码如下:
     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/

相关文章:

c# - 是否可以在 Azure Cosmos DB 中对可扩展的关注者/关注关系进行建模?

azure - 如何使用 Azure CLI 创建新的 Cosmos DB 集合时指定 10GB 固定大小

azure - 每个 COSMOS 实例一个数据库还是单个 COSMOS 实例中有多个数据库?

.net - 将客户端证书与 HttpListener 一起使用

c# - 引用字符串 [] 内存泄漏与 NET/COM 互操作

.net - .NET 调试期间是否可以控制程序流程?

.net - BlockingCollection.Dispose实际上做什么?

azure - Azure Cosmos DB 中单个查询中的计数和数据

Azure 函数需要很长时间才能触发

c# - 如何优雅地处理时区