web-dev-qa-db-ja.com

Azure DocumentDB読み取りドキュメントリソースが見つかりません

DocumentDBの情報を読み取るための.Net Consoleアプリケーションを構築しています。コンソールアプリには、EventHubからのデータがあり、クラウドに入るときに最新のデータを挿入/更新します。

DocumentDBから単一のドキュメントを読み込もうとしていますが、ドキュメントを要求する前に、ドキュメントが存在することを確認できます。

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

DocumentDBレコードにアクセスするためのリポジトリの構築について、Microsoftの this チュートリアルを使用しましたが、ほとんどすべてのメソッドの使用に成功しました。 DBを更新/削除/クエリすることはできますが、単一のアイテムを読み取ることができません。

まず、PartitionKeyを要求する例外がスローされていました。そこで、メソッドを変更して、DBで使用されているPartitionKeyをリクエストに追加しました。 PartitionKeyを追加するとすぐに、「Resource Not Found」というメッセージで別の例外がスローされます

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」を使用してDocumentsの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"
15
Andrew Konken

ドキュメント に示すように、格納するフィールドの名前ではなく、パーティションキーのvalueを指定する必要がありますパーティションキー。したがって、デバイス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;
        }
    }
}
15
Martin Costello

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

ドキュメントdbのドキュメントを読んでいる間、
フォーマットのdocLinkの場合(dbs/dbid ../colls/collid ../docs/docid ..)

解決:
次の2つの場合、ドキュメントクライアントが「リソースが見つかりません」をスローします。
1。コレクションIDが間違っている
2。指定されたpartitionKeyにはいくつかの問題があります。つまり、誤ったpartitionKeyを指定したか、partitionKeyは不要でしたが指定されました。