2017-04-25 13 views
5

मैं दस्तावेज़ डीबी में जानकारी पढ़ने के लिए एक .Net कंसोल एप्लिकेशन बना रहा हूं। कंसोल ऐप में इवेंटहब से डेटा आ रहा है और क्लाउड में आने वाले हालिया डेटा को सम्मिलित/अद्यतन करता है।Azure DocumentDB पढ़ें दस्तावेज़ संसाधन नहीं मिला

मैं दस्तावेज़ डीबी से एकवचन दस्तावेज़ पढ़ने की कोशिश कर रहा हूं और मैं पुष्टि कर सकता हूं कि दस्तावेज़ दस्तावेज़ का अनुरोध करने से पहले मौजूद है।

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

मैं DocumentDB रिकॉर्ड पहुँचने के लिए एक भंडार निर्माण के बारे में Microsoft से this ट्यूटोरियल का इस्तेमाल किया है, और लगभग सभी तरीकों का उपयोग करने में सफल रहा था। मैं डीबी अपडेट/डिलीट/क्वेरी कर सकता हूं लेकिन मैं एकवचन आइटम नहीं पढ़ सकता।

सबसे पहले यह एक विभाजन के अनुरोध का अपवाद फेंक रहा था। तो मैंने डीबी द्वारा अनुरोध में विभाजन विभाजन को जोड़ने के लिए विधि को संशोधित किया। जैसे ही मैंने 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

यह एकमात्र विभाजन कुंजी है जिसे मैं डीबी के लिए उपयोग कर रहा हूं, और जिस आईडी को मैं विधि में भेज रहा हूं वह विभाजन कुंजी के रूप में कुंजी है। इस मामले में 'DeviceId'। –

+0

मेरे मामले में मैं विभाजन कुंजी को एक पूर्णांक के रूप में सहेज रहा था लेकिन मैं इसे एक स्ट्रिंग के रूप में खोज रहा था इसलिए यह काम नहीं कर रहा था।एक बार जब मैंने तय किया कि यह ठीक से काम करता है – joalcego

उत्तर

6

रूप the documentation में दिखाया गया है, आप विभाजन कुंजी मूल्य, नहीं क्षेत्र है जो विभाजन कुंजी संग्रहीत करता है के नाम उपलब्ध कराने के लिए की जरूरत है। इस प्रकार, आपको डिवाइस आईडी को अपनी विधि में पैरामीटर के रूप में जोड़ने की आवश्यकता है और इसके मान को 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

यह मेरा मुद्दा था। मेरे मामले में आईडी और डिवाइस आईडी समान हैं। आपके सहयोग के लिए धन्यवाद। मैं कल इसे पूरा करने की कोशिश कर एक दीवार के खिलाफ अपने सिर पर टक्कर लगी थी। –

0

मैं आज सटीक मुद्दा था।

दस्तावेज़ DB में दस्तावेज़ को पढ़ते समय,
जब प्रारूप का docLink (DBS/DBID ../colls/collid ../docs/DocID ..)

समाधान:
दस्तावेज़ ग्राहक फेंकता 2 मामलों में "संसाधन नहीं मिला":
1. संग्रह आईडी गलत है
2. विभाजन के लिए कुछ समस्याएं हैं। यही है, या तो आपने गलत विभाजन दिया है, या विभाजन की आवश्यकता नहीं थी लेकिन एक दिया गया था।

संबंधित मुद्दे