从DocumentDB读取单个文档

时间:2018-12-28 22:37:15

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

我无法从DocumentDB中按ID读取单个文档。我正在构建应用程序,但遇到诸如this one之类的确切问题。我不明白我在想什么。假设我有Users集合,分区键为/ UserId,我无法阅读文档,但总是收到“找不到资源”。这很令人困惑,因为根据Microsoft的文档,我只能将Uri提供给 $webhook = new AuthnetAPIFactory(); $handler = $webhook->getWebhooksHandler($login,$transId); $webhook = $handler->getWebhook($webhookId); 方法,但是这样做需要错误分区键。我了解分区键,但是我很难理解它们如何连接到文档。例如,我的分区键是/ UserId,这是方法ReadDocumentAsync的路径,实际上我必须提供分区键的值。而且我很难理解该值是什么。

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

我的代码如下:

ReadDocumentAsync

我的数据库看起来像这样:

enter image description here

我的分区密钥如下:

enter image description here

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

当我收到“系统中不存在具有指定ID的实体”时,我遇到了类似的问题,而我可以在Azure Portal的Data Explorer中看到它。事实证明,我在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");

请求无效。