【问题标题】:Determine if Cosmos DB NotFound due to missing collection vs. document确定 Cosmos DB NotFound 是否由于缺少集合与文档
【发布时间】:2018-08-30 06:11:03
【问题描述】:

有没有办法以编程方式从DocumentClientExceptionStatusCode == HttpStatusCode.NotFound 确定是文档、集合还是数据库找不到?

我正在尝试确定是否可以实现按需收集配置,并且仅在需要时调用 DocumentClient.CreateDocumentCollectionIfNotExistsAsync。我试图避免在发出每个请求之前调用它(大概这会为每个请求增加额外的网络往返)。同样,当我知道它无济于事时,我会尽量避免在错误恢复时调用它。

通过本地模拟器的实验,我看到在这三种情况下唯一不同的字段是DocumentClientException.Error.Message,并且只有在找不到数据库时。我通常会尽量避免基于人类可读消息的异常分派。

错误的数据库名称:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Owner resource does not exist\"]}...

正确的数据库名称,错误的集合名称:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Resource Not Found\"]}...

正确的数据库名称、正确的集合名称、错误的文档 ID:

  • StatusCode: HttpStatusCode.NotFound
  • Error.Message: {\"Errors\":[\"Resource Not Found\"]}...

我打算使用带有自己报价的数据库。由于拥有自己报价的数据库中的集合很便宜,我想看看我是否can segregate each tenant in my multi-tenant application into its own collection。每个租户最终都有不同的索引和默认 TTL 策略。这组集合不是固定的,并且在运行时随着新租户的注册而动态变化。我无法预测何时需要添加新系列。没有新的租户通知:我只是收到一个需要通过在可能不存在的集合中创建文档来处理的请求。有一个垃圾收集未使用的集合的过程。

我在面向 SQL API Cosmos DB 实例的 .NET Core 2.1 应用中使用 NuGet 包 Microsoft.Azure.DocumentDB.Core 版本 1.9.1。

【问题讨论】:

  • 初始化DocumentClient时为什么不调用DocumentClient.CreateDocumentCollectionIfNotExistsAsync?无论如何它应该是一个单例。
  • @NickChapsas:更新了问题,澄清了我为什么要探索按需收集创建。

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

如果您详细查看 Message 属性,您应该会看到以下字符串,这些字符串告知是否由于 Document vs Collection 而生成了 404 Not Found 响应。

  • 资源类型:文档
  • 资源类型:集合

这并不理想,但您可以尝试将此信息从错误消息中正则表达式。

【讨论】:

  • RegEx 示例将是这个答案的一个很好的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
相关资源
最近更新 更多