2017-04-25 46 views
5

Bir DocumentDB'deki bilgileri okumak için bir .Net Console uygulaması yapıyorum. Konsol uygulamasının bir EventHub'dan gelen verileri vardır ve yeni verilere bulutta geldikçe ekler/günceller.Azure DocumentDB Belge Kaynaklarını Bulunamadı

DocumentDB'den tekil bir belgeyi okumaya çalışıyorum ve Belge istemeden önce Belgenin Var olduğunu doğrulayabilirim.

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

Ben DocumentDB kayıtlarına erişim için bir Deposu yapımı ile ilgili Microsoft'tan this öğretici kullanılan ve hemen hemen tüm yöntemlerin kullanmada başarılı oldu. DB'yi güncelleyebilir/silebilir/sorgulayabilirim ama tekil bir Öğeyi okuyamıyorum.

İlk önce PartitionKey isteyen bir istisna atıyordu. Bu nedenle, DB tarafından istekte kullanılan PartitionKey eklemek için yöntemi değiştirdim. En kısa sürede ben

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

Zaten Belgelerinin bir IEnumerable "GetItemsAsyc" kullanmak ve almak için aramalarıma modifiye ettik "Not Found Kaynak" Bir mesaj ile başka istisna atar PartitionKey ekledi olarak ve Listedeki ilk öğeyi al, ancak öğreticiden diğer tüm yöntemleri kullanabilmem için mantıklı değil ama bu "Kaynak Bulunamadı" diyerek istisnalar atmaya devam ediyor.

İstisna ben alıyorum: the documentation gösterildiği gibi

"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

Bu, aradığınız belge için kesinlikle doğru bölüm anahtarı mıdır ve onun değerini (kodunuzda göremediğim) belirtmeniz gerektiğini düşünüyorum. Ben sizin için çok benzer bir kod kullanıyorum, bölüm anahtarı hariç (desteklemeyen daha düşük bir teklif verimi kullandığım için) ve iyi çalışıyor. –

+0

DB için kullanıyorum tek bölüm anahtarıdır ve yönteme geçiriyorum kimliği PartitionKey olarak anahtardır. Bu durumda 'DeviceId'. –

+0

Benim durumumda, bölüm anahtarını bir tamsayı olarak kaydetmekteydim, ancak bunu bir dizge olarak arıyordum, bu yüzden çalışmıyordu.Bir kez ben düzgün çalıştığı düzeltildi – joalcego

cevap

6

, bölüm anahtarının değerini, bölme anahtarını saklayan alanın değil ad sağlamanız gerekiyor. Bu nedenle, aygıt kimliğini yönteminize parametre olarak eklemeniz ve değerini PartitionKey yapıcısına iletmeniz gerekir. Yani kod

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

: Örneğin itibaren

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

Bu benim sorunumdu. Benim durumumda Kimlik ve DeviceId aynıdır. Yardımın için teşekkürler. Bu işi tamamlamaya çalışırken dün kafama bir duvara çarpıyordum. –

0

Bugün tam sorunu vardı.

belge db belgeyi okurken,
formatının doclink (dbs/dbid ../Colls/collid ../docs/docid ..)

Çözüm:
belge istemci atar 2 vakada "Kaynak Bulunamadı":
1. toplama kimliği yanlış verildi
Verilen 2. partitionKey bazı sorunlar var. Yani, ya yanlış partitionKey verdiniz, ya da partitionKey gerekli değildi ama biri verildi.