Friday 15 January 2010

recursion - DocumentDB call stored procedure from another stored procedure or itself -


क्या दस्तावेज़डीबी दस्तावेजों के विरुद्ध संग्रहीत कार्यविधियों को पुनरावर्तित करने के लिए कोई तरीका है (या अगर यूडीएफ भी काम करेगा)?

हमारे पास एक ऐसा दस्तावेज़ है जो कुछ ऐसा दिखता है:

  {"docID": "my_id", "owner": "fred", "items": [{"itemID": "1", "प्रकार": "आइटम", "मूल्य": 3}, {"आइटम आईडी": "2", "प्रकार": "समूह", "आइटम": [{"itemID": "2.1" "प्रकार": "समूह", "आइटम": [{"आइटम आईडी": "2.1.1", "प्रकार": "आइटम", "मान": 2}, {"आइटम आईडी": "2.1.2", "प्रकार": "आइटम", "मान": 4}]}, {"itemID": "2.2", "प्रकार": "आइटम", "मान": 1}]}}}   

किसी भी समय हमारे पास "आइटम" है, वह "आइटम" a राइ में ऐसी प्रविष्टियां हो सकती हैं जो "type": "item" और "type": "समूह" का एक मिश्रण है। प्रविष्टियां जो "प्रकार": "आइटम" के पास एक सरल "मान" फ़ील्ड है जिसे समझा जाना चाहिए प्रविष्टियां जो "प्रकार": "समूह" के पास एक "आइटम" सरणी हैं ... और इतने पर। सिद्धांत रूप में, पुनरावृत्ति के स्तर पर कोई सीमा नहीं है, जिसे मैं मानता हूं एक समस्या है, लेकिन व्यवहार में, स्तर शायद ही कभी 4 या 5 गहरे से नीचे हो जाएगा।

स्यूडोकोड के लिए जो मैं कोशिश कर रहा हूं लिखते हैं ऐसा कुछ दिखता है:

  फ़ंक्शन योग (वस्तुओं) {int total = 0; प्रत्येक आइटम (वस्तु में आइटम) के लिए (यदि (item.type == "आइटम") {कुल + = item.value; } और {कुल + = योग की राशि (आइटम.इटम); }} कुल वापसी; } समारोह sumAllValues ​​() {var ctx = getContext (); Var coll = ctx.getCollection (); Var प्रतिक्रिया = ctx.getResponse (); // मालिक के द्वारा डॉक्स के लिए क्वेरी var filterQuery = 'SELECT * FROM docs d जहां d.owner = \\\ "fred \\\"'; Var done = coll.queryDocuments (coll.getSelfLink), filterQuery, {}, फ़ंक्शन (गलती, डॉक्स, विकल्प) {यदि (गलती) नए त्रुटि ('त्रुटि' + err.message); var total = 0; Docs .for ईका (फ़ंक्शन (डॉक्टर) {कुल + = योग योग) ();;); प्रतिक्रिया .सेटबॉडी ('कुल:' + कुल);}); }  

क्या ये भी संभव है? DocumentDB एक sproc को दूसरे sproc से बुलाते हुए समर्थन करता है? क्या एक स्प्रेक कॉल ही हो सकता है?

मुझे कुछ दस्तावेज़डीबी संग्रहीत कार्यविधि संदर्भ ऑनलाइन मिल चुके हैं, जिनमें से और कई अन्य पृष्ठों की मेजबानी भी शामिल है।

यदि यह संभव है, तो मुझे लगता है कि किसी भी तरह से एक स्प्रेक को कॉल करने के लिए संग्रह को पूछना है, जिसे मैं कॉल करना चाहता हूं, और फिर किसी एक शब्द के साथ सीधे कोड के रूप में सीधे sumTotals () को कॉल करने की बजाय स्प्रेक का संदर्भ देता हूं।

हम सिर्फ DocumentDB के साथ प्रोग्रामिंग को देखना शुरू कर रहे हैं, इसलिए हम पूरी तरह से सुनिश्चित नहीं हैं कि हम इसके साथ अभी तक क्या कर सकते हैं। किसी भी सहायता या सलाह के लिए धन्यवाद।

मुझे लगता है कि आप सही रास्ते पर हैं।

हालांकि, आप एक संग्रहीत कार्यविधि के अंदर जेएस फ़ंक्शन को परिभाषित कर सकते हैं, जो हो सकता है उस संग्रहीत कार्यविधि के भीतर से संदर्भित, बुलाया जाता है, और पुन: उपयोग किया जाता है

इस मामले में, अपने sumValues ​​() फ़ंक्शन को माता-पिता sumAllValues ​​() संग्रहीत कार्यविधि (केवल swapItems () की तरह परिभाषित करें) उदाहरण आपने उल्लेख किया है।)

  फ़ंक्शन sum allvalues ​​() {var ctx = getContext (); Var coll = ctx.getCollection (); Var प्रतिक्रिया = ctx.getResponse (); // मालिक के द्वारा डॉक्स के लिए क्वेरी var filterQuery = 'SELECT * FROM docs d जहां d.owner = \\\ "fred \\\"'; Var done = coll.queryDocuments (coll.getSelfLink), filterQuery, {}, फ़ंक्शन (गलती, डॉक्स, विकल्प) {यदि (ग़लती) नया त्रुटि ('त्रुटि' + त्रुटि संदेश) फेंकें; var total = 0; docs .for ईका (फ़ंक्शन (डॉक) {कुल + = योग राशि (डॉक्टर। इमेजेस);}); प्रतिक्रिया .सेटबॉडी ('कुल:' + कुल);}); समारोह योग (वस्तुओं) {int total = 0; Items.for प्रत्येक (समारोह (आइटम) {यदि (item.type == "आइटम") {कुल + = item.value;} और {कुल + = योग की राशि (item.items);}}); कुल वापसी; }}  

आप उस तर्क के लिए यूडीएफ भी परिभाषित कर सकते हैं जिसे आप कई संग्रहीत कार्यविधियों और प्रश्नों में साझा और फिर से उपयोग करना चाहते हैं।


No comments:

Post a Comment