宇宙DB。我希望所有数据都在同一集合中。我可以无限收藏吗?

时间:2018-11-20 22:09:22

标签: c# nosql azure-cosmosdb

目前,我正在使用固定的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;
} 

1 个答案:

答案 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文档。