【问题标题】:Reading single document from DocumentDB从 DocumentDB 读取单个文档
【发布时间】:2019-05-26 15:55:22
【问题描述】:

我无法从 DocumentDB 中按 ID 读取单个文档。我正在构建应用程序,但我遇到了 this one 这样的确切问题。我不明白我错过了什么。假设我有用户集合,我的分区键有 /UserId,我无法读取文档,我总是收到“找不到资源”。这很令人困惑,因为根据 Microsoft 的文档,我只能将 Uri 提供给 ReadDocumentAsync 方法,但是这样做我会得到错误的分区键。我理解分区键,但我很难理解它们是如何连接到文档的。例如,我的分区键是/UserId,它是一个路径,对于方法ReadDocumentAsync,我实际上必须提供分区键的值。我很难理解这个价值是什么。

我尝试使用 c# 代码创建文档并使用系统创建的 ID (GUID) 检索相同的文档,但它不起作用...这听起来简单而基本,但有人可以指出我哪里错了吗?或者向我展示我可以使用的 C# .NET Core 代码、示例集合、示例文档和示例代码的参考。 Microsoft 的文档/示例代码对我不起作用。

我的代码如下所示:

            documentId = "1c230b2d-1e37-9e02-d3a0-10364a188487";
            collectionId = "Users";
            RequestOptions options = new RequestOptions();
            options.PartitionKey = new PartitionKey("201801-M");
            var document = await _serverConnection.ReadDocumentAsync(UriFactory.CreateDocumentUri(databaseId, collectionId, documentId),options);
            return document;

我的数据库如下所示:

我的分区键如下所示:

【问题讨论】:

  • 像您链接的示例一样,显示您的代码。
  • @LarsTech 我添加了代码和截图

标签: c# .net-core azure-cosmosdb document-database


【解决方案1】:

这是我在机器上使用的模拟器问题。我已连接到实际的 CosmosDB,它工作正常...我的模拟器有故障并抛出错误,停止工作,开始工作,一旦我连接到 Azure,它就可以很好地检索示例数据。

【讨论】:

    【解决方案2】:

    我遇到了这个问题。我的解决方案是确保将 PartitionKey 及其值写入 json 数据对象完全,就像它在集合中一样。例如,如果您的集合的分区键是 /state,并且您想要一个值“Florida”,那么在您的 json 数据对象中,您的 json 数据中必须包含以下内容:WriteDocumentAsync 中的“state”:“Florida”。就我而言,我使用的是动态 json 数据,因此我必须将 partitionkey 和 value 注入到我的 json 数据对象中。如果未正确完成,您将收到错误消息,当您尝试读取数据时未找到具有指定 ID 的实体。 您有两个选择:1 使用匹配的分区键将数据写入集合,或者 2 在您的请求选项中使用“Undefined.Value”作为分区键。使用 Undefined.Value 将在集合中找到任何匹配的 id。 使用 ReadDocumentAsync 读回文档时,您必须将 RequestOptions.PartitionKey 设置为您正在寻找的所需分区键值。 希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      当我收到“系统中不存在具有指定 ID 的实体”时,我遇到了类似的问题,而我可以在 Azure 门户的数据资源管理器中看到它。事实证明,我在 json 中使用整数作为分区键,并且必须在请求中以相同的方式设置它:

       var documentId1 = "150:060e7249-11cd-4d5c-b666-7711d9498ab4";
       var collectionId = _collectionName;
       var databaseId = _databaseName;
       RequestOptions options1 = new RequestOptions();
       options1.PartitionKey = new PartitionKey(150);
       var document = await _documentClient.ReadDocumentAsync(
                      UriFactory.CreateDocumentUri(databaseId, collectionId, documentId1),options1);
      

      所以如果我写:

      options1.PartitionKey = new PartitionKey("150");
      

      请求无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多