簡體   English   中英

從 DocumentDB 讀取單個文檔

[英]Reading single document from DocumentDB

我無法通過 DocumentDB 中的 id 讀取單個文檔。 我正在構建應用程序,但遇到了與此類似的確切問題。 我不明白我錯過了什么。 假設我有 Users 集合並且我的分區鍵有 /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;

我的數據庫看起來像這樣:

在此處輸入圖像描述

我的分區鍵看起來像這樣:

在此處輸入圖像描述

這是我在機器上使用的模擬器問題。 我已經連接到實際的 CosmosDB,它工作正常......我的模擬器有問題並拋出錯誤,停止工作,開始工作,一旦我連接到 Azure,它就可以很好地檢索示例數據。

我有這個問題。 我的解決方案是確保將 PartitionKey 及其值寫入 json 數據對象,就像它在集合中一樣。 例如,如果您的集合的分區鍵是 /state 並且您想要一個值“Florida”,那么在您的 json 數據對象中必須在您的 json 數據中包含以下內容:“state”:“Florida”在您的 WriteDocumentAsync 中。 在我的例子中,我使用的是動態 json 數據,所以我必須將 partitionkey 和值注入到我的 json 數據對象中。 如果沒有正確完成,您將收到錯誤消息,當您嘗試讀取數據時,找不到具有指定 ID 的實體。 您有兩種選擇:1 使用匹配的分區鍵將數據寫出到集合中,或者 2 在您的請求選項中使用“Undefined.Value”作為分區鍵。 使用 Undefined.Value 將在集合中找到任何匹配的 id。 使用 ReadDocumentAsync 回讀文檔時,您必須將 RequestOptions.PartitionKey 設置為您正在尋找的所需分區鍵值。 希望這可以幫助。

當我收到“系統中不存在具有指定 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");

請求將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM