【问题标题】:Cosmos DB internal error when fetching documents获取文档时发生 Cosmos DB 内部错误
【发布时间】:2019-05-27 11:11:14
【问题描述】:

使用 Azure Cosmos DB 数据资源管理器没有显示任何值,即使我知道其中有数据。使用我的网络应用程序时,我可以看到它插入数据。我还可以通过从本地 GUI 查询 db.files.stats().count 来验证这一点。但是,在我尝试从数据库读取的 UI 中的任何时候,它都会中断——这似乎与我在尝试使用的 GUI 中看到的问题相同。

查看 Chrome 中的网络选项卡,每当我尝试刷新结果集时,都会看到一个失败的请求被发送到 https://portal-prod-northeurope-mongo.portal-prod-northeurope.p.azurewebsites.net 端点。 它返回的响应是

命令查找失败:处理此请求时发生未知服务器错误..

当我使用本地 GUI 查询数据库时,我得到了同样的错误,所以我认为它与 Azure 门户没有直接关系。 我试图删除并重新创建集合,但无济于事。 当我在 Cosmos DB 模拟器上本地运行所有这些时,它工作得很好。

集合是这样定义的:

    az cosmosdb collection create --resource-group $resourceGroup `
                                  --name $dbService `
                                  --collection-name 'files' `
                                  --db-name $db `
                                  --partition-key-path '/p'

    az cosmosdb collection create --resource-group $resourceGroup `
                                  --name $dbService `
                                  --collection-name 'users' `
                                  --db-name $db

    az cosmosdb collection create --resource-group $resourceGroup `
                                  --name $dbService `
                                  --collection-name 'projects' `
                                  --db-name $db `
                                  --partition-key-path '/cb'

一个示例对象如下:

internal class File
{
    [JsonProperty(PropertyName = "id")]
    public Guid Id { get; set; }

    [JsonProperty(PropertyName = "of")]
    public string OriginalFilename { get; set; }

    [JsonProperty(PropertyName = "if")]
    public string InternalFilename { get; set; }

    [JsonProperty(PropertyName = "ua")]
    public DateTime UploadedAt { get; set; }

    [JsonProperty(PropertyName = "p")]
    public Guid ProjectId { get; set; }

    [JsonProperty(PropertyName = "su")]
    public string StorageUri { get; set; }

    [JsonProperty(PropertyName = "t")]
    public byte Type { get; set; }

    public override string ToString() => JsonConvert.SerializeObject(this);
}

【问题讨论】:

  • Cosmos DB 支持人员要求我将其放在这里 - 我已在支持请求中包含可识别信息,以便他们可以在必要时查看确切的实例。
  • 你是如何插入数据的?这看起来像一个 Mongo API 帐户。您是否通过 Mongo 客户端插入数据?或者您使用的是数据迁移工具还是 Cosmos DB SDK?
  • @MatiasQuaranta Cosmos DB SDK。没什么特别的,代码就是这样的:gist.github.com/Vannevelj/…

标签: azure azure-cosmosdb


【解决方案1】:

根据 cmets,您遇到此问题的原因是您在 Mongo API 帐户上使用 Cosmos DB SDK。 Portal 和 GUI 都在尝试通过 Mongo 客户端使用数据,而您的数据正在通过不同的 API 保存。

Cosmos DB SDK 使用 SQL API 来保存文档。 Mongo API 帐户旨在通过 Mongo 客户端/驱动程序使用和使用。

如果您的应用程序需要 Mongo,则使用 Mongo 客户端/驱动程序来存储文档,不要使用 Cosmos DB SDK。

如果您的应用程序不需要 Mongo(因为您使用的是 Cosmos DB SDK,所以听起来不像),创建一个 Core API(SQL) 帐户。

【讨论】:

  • 你是对的,这似乎已经成功了。清除集合并使用 Mongo 驱动程序后,我可以看到数据的格式完全不同,并且可以从门户中看到。似乎我对 Cosmos DB 与其支持的模型之间的关系存在根本性的误解。如果在门户网站中有某种警告消息会很有帮助,但仍然感谢!
【解决方案2】:

这里是否涉及数据迁移...如何在 Cosmos DB 中创建数据?您能否提供一个包含所有系统生成属性的 Json 文档示例。 Data Explorer 问题往往存在此迁移数据,其中提供了预定义的 ID 值但与 Cosmos DB 所需的格式不匹配。

【讨论】:

  • 我再次删除了整个集合并重新创建了数据,因此它们都应该采用一种格式 - 仍然存在问题。我已经将Guid 的所有用法替换为string,以确保不会出现任何奇怪的行为。这是本地数据浏览器中的条目结构,可以正常工作。在 Azure 上执行相同的步骤,中断。 gist.github.com/Vannevelj/…
  • 我不确定它是否与 Guid 删除有关,但我可以在我的 UI 中看到数据,这意味着代码可以很好地检索它。只有当我尝试通过 GUI 在 Azure 上查看 Cosmos DB 中的数据时,它才会中断。
猜你喜欢
  • 2018-06-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多