2017-04-25 18 views
5

DocumentDBの情報を読み取るための.Netコンソールアプリケーションを構築しています。コンソールアプリケーションは、EventHubからのデータを受け取り、クラウドに入ってくる最新のデータを挿入/更新します。Azure DocumentDBドキュメントリソースが見つかりません。

私はDocumentDBから単数の文書を読むことを試みており、文書を要求する前にその文書が存在することを確認できます。

if (DocumentDBRepository<DocumentDBItem>.DoesItemExist(name)) 
{ 
    device = await DocumentDBRepository<DocumentDBItem>.GetItemAsync(name); 
} 

私はDocumentDBレコードにアクセスするためのリポジトリの構築について、マイクロソフトからthisチュートリアルを使用して、ほとんどすべてのメソッドのを使ってで成功しました。私はDBを更新/削除/クエリすることができますが、私は特異なItemを読むことができません。

まず、PartitionKeyを要求する例外がスローされました。そこで、DBで使用されているPartitionKeyをリクエストに追加する方法を変更しました。すぐに私はのPartitionKeyを追加したとして、それは

public static async Task<T> GetItemAsync(string id) 
{ 
    try 
    { 
     RequestOptions options = new RequestOptions(); 
     options.PartitionKey = new PartitionKey("DeviceId"); 
     Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), options); 
     return (T)(dynamic)document; 
    } 
    catch (DocumentClientException e) 
    { 
     if (e.StatusCode == HttpStatusCode.NotFound) 
     { 
      return null; 
     } 
     else 
     { 
      throw; 
     } 
    } 
} 

PartitionKeyFromAzure

のメッセージ、「リソースが見つかりません」と、別の例外がスローされます私はすでに「GetItemsAsyc」を使用して、ドキュメントのIEnumerableをを得るために、私の呼び出しを変更しましたリストの最初の項目を取得しますが、チュートリアルの他のすべてのメソッドを使用できる理由はわかりませんが、この項目は「リソースが見つかりません」という例外をスローし続けます。私は取得しています

例外:

"Message: {\"Errors\":[\"Resource Not Found\"]}\r\nActivityId: e317ae66-6500-476c-b70e-c986c4cbf1d9, Request URI: /apps/e842e452-2347-4a8e-8588-2f5f8b4803ad/services/2c490552-a24d-4a9d-a786-992c07356545/partitions/0281cfdd-0c60-499f-be4a-289723a7dbf9/replicas/131336364114731886s" 
+0

これは間違いなくあなたが探しているドキュメントの正しいパーティションキーですか、あなたはその値を指定する必要があると思います(あなたのコードでは見えません)?パーティションキーなしで(私がそれをサポートしていないより低いオファースループットを使用しているので)、あなたのものに非常によく似たコードを使用しています。 –

+0

これは私がDBに使用している唯一のパーティションキーです。メソッドに渡すIDはPar​​titionKeyのKeyです。この場合は「DeviceId」です。 –

+0

私の場合は、パーティションキーを整数として保存していましたが、文字列として検索していたため、機能しませんでした。一度私はそれが正常に動作することを修正しました – joalcego

答えて

6

the documentationに示すように、あなたはパーティションキーではなく、パーティションキーを格納するフィールドの名前のを提供する必要があります。したがって、メソッドにパラメータとしてデバイスIDを追加し、その値をPartitionKeyコンストラクタに渡す必要があります。だからあなたのコードの

// Read document. Needs the partition key and the ID to be specified 
Document result = await client.ReadDocumentAsync(
    UriFactory.CreateDocumentUri("db", "coll", "XMS-001-FE24C"), 
    new RequestOptions { PartitionKey = new PartitionKey("XMS-0001") }); 

:例から

public static async Task<T> GetItemAsync(string id, string deviceId) 
{ 
    try 
    { 
     RequestOptions options = new RequestOptions(); 
     options.PartitionKey = new PartitionKey(deviceId); 
     Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), options); 
     return (T)(dynamic)document; 
    } 
    catch (DocumentClientException e) 
    { 
     if (e.StatusCode == HttpStatusCode.NotFound) 
     { 
      return null; 
     } 
     else 
     { 
      throw; 
     } 
    } 
} 
+1

これは私の問題だった。私の場合、IdとDeviceIdは同じです。ご協力ありがとうございました。私は昨日これを完成しようと壁に頭を打っていた。 –

0

今日は、正確な問題がありました。

形式の文書リンクが(DBS/DBID ../colls/COLLID .. /ドキュメント/ DOCID ...)

ソリューション際の文書デシベル、
でドキュメントを読んでいる間:
文書クライアントがスローされます2つのケースで「リソースが見つかりません」:
1.コレクションIDが間違っている
2.与えられたpartitionKeyにはいくつかの問題があります。つまり、間違ったpartitionKeyを指定したか、partitionKeyは必要ではありませんが、与えられたものです。