我的代码中有一个方法,负责将单个文档插入到cosmosDB中。当我以前在RequestOptions中指定partitionId时插入文档时,它曾经工作正常:
public Document createOne(JSONObject aJSONObject) throws DocumentClientException {
Document aDocument = new Document(aJSONObject.toString());
return documentClient.createDocument(getCollectionLink(), aDocument, null, false).getResource();
}
但是如果我改变我的代码以便在RequestOptions
中传递partitionId,就像这样:
public Document createOne(JSONObject aJSONObject, String aPartitionKeyStr) throws DocumentClientException {
Document aDocument = new Document(aJSONObject.toString());
PartitionKey aPartitionKey = new PartitionKey(aPartitionKeyStr);
RequestOptions requestOptions = new RequestOptions();
requestOptions.setPartitionKey(aPartitionKey);
return documentClient.createDocument(getCollectionLink(), aDocument, requestOptions, false).getResource();
}
我收到上述错误:PartitionKey extracted from document doesn't match the one specified in the header
。我非常确定我正确传递了分区键值,因为我有相同的createMany
方法,它使用存储过程进行批量插入,并在requestOptions中传递partitionKey,并且它正在工作精细。我已经在互联网上查找了类似的问题,这些问题似乎与我的问题有关,例如this和this,但他们专注于正确传递partitionKey。我确定我正确地传递了partitionKey。
在我们的集合中,/clientId
键用作分区键,在插入函数的第一行设置断点,得到此output,aPartitionKey打印如下:{{1} }
我还有一个疑问,在插入单个文档时传递partitionKey会对性能有任何改进吗?我在azure的sdk文档中也看到here(显示分区集合用法的示例),他们在插入时没有使用分区键,只在查询期间。
答案 0 :(得分:1)
要插入单个文档,您无需在请求选项中指定Partition Key
值。
如果查看Creating a Document
的REST API文档,您会注意到那里没有x-ms-documentdb-partitionkey
标头。这就是为什么你的代码在请求选项中没有指定分区键时会起作用的原因(它作为请求头发送)。
如果您尝试更新文档,则需要在请求选项中指定PartitionKey
值。请参阅Replace Document
REST API。