2015-09-18 5 views
5

मैं अभी रेडक्ट के साथ लड़ रहा हूं और मुझे यह समझने की ज़रूरत नहीं है।मोंगोडब में रेडैक्ट मुझे अस्पष्ट लगता है

मैं सिर्फ डॉक्स पढ़ सकते हैं और एक संग्रह ग्रेड पर संशोधित का उपयोग करने की कोशिश की है (यह MongoDB ऑनलाइन प्रशिक्षण से आता है)

संग्रह "ग्रेड" में एक दस्तावेज़ इस तरह दिखता है:

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 57.92947112575566 
     }, 
     { 
      "type" : "quiz", 
      "score" : 21.24542588206755 
     }, 
     { 
      "type" : "homework", 
      "score" : 68.19567810587429 
     }, 
     { 
      "type" : "homework", 
      "score" : 67.95019716560351 
     }, 
     { 
      "type" : "homework", 
      "score" : 18.81037253352722 
     } 
    ] 
} 

मैं निम्न क्वेरी का उपयोग करें:

db.grades.aggregate([ 
    { $match: { student_id: 0 } }, 
    { 
     $redact: { 
      $cond: { 
       if: { $eq: [ "$type" , "exam" ] }, 
       then: "$$PRUNE", 
       else: "$$DESCEND" 
      } 
     } 
    } 

] );

इस प्रश्न के साथ, प्रत्येक प्रकार की एक परीक्षा पाई जाती है, इस उप दस्तावेज़ को बाहर रखा जाना चाहिए। और यह काम करता है, परिणाम है:

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
    { 
     "type" : "quiz", 
     "score" : 21.24542588206755 
    }, 
    { 
     "type" : "homework", 
     "score" : 68.19567810587429 
    }, 
    { 
     "type" : "homework", 
     "score" : 67.95019716560351 
    }, 
    { 
     "type" : "homework", 
     "score" : 18.81037253352722 
    } 
] 
} 

लेकिन अगर मैं शर्त को उलटने, मैं उम्मीद करते हैं कि केवल परीक्षा परिणाम में रखा जाता है:

if: { $eq: [ "$type" , "exam" ] }, 
     then: "$$DESCEND", 
     else: "$$PRUNE" 

लेकिन परिणाम खाली है।

मुझे समझ में नहीं आता कि प्रकार "परीक्षा" के उप-दस्तावेज़ क्यों शामिल नहीं हैं।

+1

फिर एक और mongodb विश्वविद्यालय होमवर्क। – styvane

+2

@ user3100115 होमवर्क प्रश्न आवश्यक रूप से खराब प्रश्न नहीं हैं जब तक कि वे इस तरह से लिखे गए हैं कि अंतर्दृष्टि की तलाश है और न केवल एक पूर्ण समाधान जो पर्याप्त ग्रेड प्राप्त करता है। – Philipp

+1

@ फिलिप हालांकि, मुझे पहले हाथ अनुभव से पता है कि छात्रों को प्रत्येक चरण को एक लंबे फैशन में पढ़ाया जाता है। विस्तृत, मैं जोड़ सकता हूं, और दस्तावेज खराब नहीं है, या तो। मेरे दृष्टिकोण से, यह प्रत्येक कक्षा का एक छात्र पर्याप्त जानकारी देने का लक्ष्य है ताकि दस्तावेज कम से कम एक अनुस्मारक बन जाए। उस संदर्भ में, मौजूदा क्वेरी के साथ सवाल थोड़ा सा लगता है ... ... मेरे मनमाना। –

उत्तर

8

$redact चरण रूट दस्तावेज़ और उसके क्षेत्रों में शुरू होता है, और केवल तभी जब यह दस्तावेज़ $$DESCEND पर शर्त को पूरा करता है, तो वह उस दस्तावेज़ में शामिल उप-दस्तावेज़ों की जांच करता है। इसलिए $eq: [ "$type" , "exam" ] गलत है,

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [] // Some array. I will look at this later. 
} 

यह भी एक type क्षेत्र यहाँ नहीं मिल रहा है: इसका मतलब है कि पहली बात यह है $ संपादन अपने दस्तावेज़ के साथ करता है इस की जांच है। जब स्थिति झूठी होती है तो आप क्या करने के लिए $ रेडक्ट करते थे? else: "$$PRUNE", इसलिए सब-दस्तावेज़ की जांच होने से पहले पूरा दस्तावेज़ छीन लिया जाता है।

एक कामकाज के रूप में, $type या तो "exam" या परीक्षण मौजूद है, तो परीक्षण करें। आपने स्पष्ट रूप से एक कामकाजी समाधान के लिए नहीं पूछा था, इसलिए मैं इसे करने के तरीके के बारे में जानने के लिए इसे एक अभ्यास के रूप में छोड़ दूंगा।

+0

ठीक है धन्यवाद। मैं एक समाधान की तलाश नहीं कर रहा था लेकिन मैं एक स्पष्टीकरण की तलाश में था और आपका बहुत अच्छा था। बहुत बहुत धन्यवाद। –

+0

मैं सुझाए गए कामकाज को लागू करने की कोशिश कर रहा हूं लेकिन मैं इसे काम नहीं कर सकता। किसी भी उदाहरण काम कोड की सराहना की जाएगी! – papaiatis

+0

@papaiatis कृपया अपने उदाहरण दस्तावेज़ और आपके द्वारा पहले से किए गए कोड के साथ एक नया प्रश्न पूछें। – Philipp

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