目前,我正在使用固定的10 GB Cosmos DB,将所有数据保存在同一集合中。我想继续这样。所以我只需要创建一个无限的集合。当我这样做时,它要求提供一个分区键,但我不太了解它的用途。我试图阅读有关它的内容,但并没有获得太多的技巧。希望你们能帮助我。
今天,我创建这样的文档。如果使用无限收集,是否应该以另一种方式完成。考虑我应该在某个地方声明分区密钥吗?:
protected async Task<bool> CreateDocumentAsync(Resource document)
{
var collectionUri = UriFactory.CreateDocumentCollectionUri(_db.Options.Value.DatabaseName, _db.Options.Value.CollectionName);
ResourceResponse<Document> result = null;
for (int i = 0; i < MaxRetryCount; i++)
{
try
{
result = await _db.Client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(_db.Options.Value.DatabaseName, _db.Options.Value.CollectionName), document);
break;
}
catch (DocumentClientException dex) when (dex.StatusCode.HasValue && (int)dex.StatusCode.Value == 429)
{
_logger.LogWarning($"");
await Task.Delay(dex.RetryAfter);
}
}
if (result == null)
return false;
int statusCode = (int)result.StatusCode;
return statusCode >= 200 && statusCode < 300;
}
答案 0 :(得分:0)
可以通过为RequestOptions
对象提供PartitionKey
值集来指定分区键值。
您的创建文档行将变为:
var requestOptions = new RequestOptions{
PartitionKey = new PartitionKey("yourPartitionKeyValueHere");
}
result = await _db.Client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(_db.Options.Value.DatabaseName, _db.Options.Value.CollectionName), document, requestOptions);
但是它确实会让您不了解CosmosDB分区,这意味着您可能会陷入非常深的陷阱。
在查询或读取文档时,分区键定义应该是大多数时候已知的属性。
我强烈建议您观看此视频。这将极大地帮助您了解分区:https://azure.microsoft.com/en-us/resources/videos/azure-documentdb-elastic-scale-partitioning/
在旁注中,我可以看到您使用CosmosDB SDK时遇到的一些错误,这些错误无法在一个答案中解决。例如,CosmosDB SDK已经具有通过RetryOptions
对象在文档客户端级别处理重试策略逻辑的逻辑,因此您无需编写任何自定义代码。我建议您阅读更多CosmosDB文档。