web-dev-qa-db-ger.com

Azure DocumentDB Read Document-Ressource nicht gefunden

Ich erstelle eine .Net Console-Anwendung, um Informationen in einer DocumentDB zu lesen. Die Konsolen-App enthält Daten, die von einem EventHub stammen, und fügt aktuelle Daten ein bzw. aktualisiert sie, sobald sie in die Cloud gelangen.

Ich versuche, ein einzelnes Dokument aus DocumentDB zu lesen, und ich kann bestätigen, dass das Dokument vorhanden ist, bevor ich das Dokument anfordere.

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

Ich habe das Tutorial this von Microsoft zum Erstellen eines Repositorys für den Zugriff auf die DocumentDB-Datensätze verwendet und konnte fast alle Methoden erfolgreich anwenden. Ich kann die Datenbank aktualisieren/löschen/abfragen, aber ich kann kein einzelnes Element lesen.

Zuerst wurde eine Ausnahme ausgelöst, die einen PartitionKey anforderte. Deshalb habe ich die Methode geändert, um der Anforderung den PartitionKey hinzuzufügen, der von der Datenbank verwendet wird. Sobald ich den PartitionKey hinzugefügt habe, wird eine weitere Ausnahme mit der Meldung "Resource Not Found" (Ressource nicht gefunden) ausgelöst.

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

Ich habe meine Aufrufe bereits geändert, um "GetItemsAsyc" zu verwenden, eine IEnumerable of Documents abzurufen und das erste Element in der Liste abzurufen, aber es macht keinen Sinn, warum ich alle anderen Methoden aus dem Lernprogramm verwenden kann, aber dieses wird fortgesetzt um Ausnahmen auszulösen, in denen "Ressource nicht gefunden" steht.

Ausnahme, die ich bekomme:

"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"
6
Andrew Konken

Wie in der Dokumentation gezeigt, müssen Sie den Wert des Partitionsschlüssels angeben, nicht den Namen des Felds, in dem der Partitionsschlüssel gespeichert ist. Daher müssen Sie der Methode die Geräte-ID als Parameter hinzufügen und ihren Wert an den Konstruktor PartitionKey übergeben.

Aus dem Beispiel:

// 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") });

Also für deinen Code:

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;
        }
    }
}
11
Martin Costello

Ich hatte heute genaues Problem.

Beim Lesen des Dokuments in Dokument db,
wenn der docLink des Formats (dbs/dbid ../colls/collid ../docs/docid ..)

Lösung:
Der Document Client gibt in zwei Fällen "Resource Not Found" aus:
1. Die ID der Sammlung wurde falsch angegeben
2. Der angegebene partitionKey hat einige Probleme. Das heißt, Sie haben entweder einen falschen partitionKey angegeben, oder partitionKey wurde nicht benötigt, aber einer wurde angegeben.