आपको एकत्रीकरण ढांचे का उपयोग करने की आवश्यकता होगी। एकत्रीकरण अंत में कुछ इस तरह दिखाई देगा:
db.stack.aggregate([
{ $match: { "samples.key" : "test-key" } },
{ $unwind : "$samples" },
{ $match : { "samples.key" : "test-key" } },
{ $project : { "new_key" : "$samples.key", "new_value" : "$samples.value" } },
{ $group : { `_id` : "$new_key", answer : { $avg : "$new_value" } } }
])
एकत्रीकरण ढांचे के बारे में सोचने का सबसे अच्छा तरीका असेंबली लाइन की तरह है। क्वेरी स्वयं JSON दस्तावेज़ों की एक सरणी है, जहाँ प्रत्येक उप-दस्तावेज़ असेंबली में एक अलग चरण का प्रतिनिधित्व करता है।
चरण 1:$मिलान
पहला चरण एक बुनियादी फ़िल्टर है, जैसे SQL में WHERE क्लॉज। हम इस चरण को सबसे पहले उन सभी दस्तावेज़ों को फ़िल्टर करने के लिए रखते हैं जिनमें test-key
. युक्त सरणी तत्व नहीं है . इसे पाइपलाइन की शुरुआत में रखने से एकत्रीकरण इंडेक्स का उपयोग करने की अनुमति देता है।
चरण 2:$अनविंड
दूसरा चरण, $unwind
, "नमूने" सरणी में प्रत्येक तत्व को अलग करने के लिए उपयोग किया जाता है ताकि हम उन सभी में संचालन कर सकें। यदि आप केवल उस चरण के साथ क्वेरी चलाते हैं, तो आप देखेंगे कि मेरा क्या मतलब है। लंबी कहानी छोटी:
{ name : "bob",
children : [ {"name" : mary}, { "name" : "sue" } ]
}
दो दस्तावेज़ बन जाते हैं:
{ name : "bob", children : [ { "name" : mary } ] }
{ name : "bob", children : [ { "name" : sue } ] }
चरण 3:$मिलान
तीसरा चरण, $match
, पहले $match
. का सटीक डुप्लिकेट है मंच, लेकिन एक अलग उद्देश्य है। चूंकि यह $unwind
. का अनुसरण करता है , यह चरण पिछले सरणी तत्वों को फ़िल्टर करता है, अब दस्तावेज़, जो फ़िल्टर मानदंड से मेल नहीं खाते हैं। इस मामले में, हम केवल वही दस्तावेज़ रखते हैं जहाँ samples.key = "test-key"
चरण 4:$प्रोजेक्ट (वैकल्पिक)
चौथा चरण, $project
, दस्तावेज़ का पुनर्गठन करता है। इस मामले में, मैंने वस्तुओं को सरणी से बाहर निकाला ताकि मैं उन्हें सीधे संदर्भित कर सकूं। ऊपर दिए गए उदाहरण का उपयोग करना..
{ name : "bob", children : [ { "name" : mary } ] }
बन जाता है
{ new_name : "bob", new_child_name : mary }
ध्यान दें कि यह चरण पूरी तरह से वैकल्पिक है; बाद के चरणों को इस $project
. के बिना भी पूरा किया जा सकता है कुछ मामूली बदलाव के बाद। ज्यादातर मामलों में $project
पूरी तरह से कॉस्मेटिक है; एग्रीगेशन में कई ऑप्टिमाइज़ेशन होते हैं जैसे कि मैन्युअल रूप से $project
में फ़ील्ड्स को शामिल करना या बाहर करना आवश्यक नहीं होना चाहिए।
चरण 5:$group
अंत में, $group
वह जगह है जहां जादू होता है। _id
मान लें कि आप SQL दुनिया में "समूह द्वारा" क्या करेंगे। दूसरा फ़ील्ड उस मान से अधिक औसत बता रहा है जिसे मैंने $project
. में परिभाषित किया है कदम। आप आसानी से $sum
. को स्थानापन्न कर सकते हैं एक योग करने के लिए, लेकिन एक गणना ऑपरेशन आमतौर पर निम्नलिखित तरीके से किया जाता है:my_count : { $sum : 1 }
।
यहां ध्यान देने वाली सबसे महत्वपूर्ण बात यह है कि किए जा रहे अधिकांश कार्य डेटा को उस बिंदु पर प्रारूपित करना है जहां ऑपरेशन करना आसान है।
अंतिम नोट
अंत में, मैं यह नोट करना चाहता था कि यह नहीं होगा samples.value
. के बाद से उपलब्ध कराए गए उदाहरण डेटा पर काम करें टेक्स्ट के रूप में परिभाषित किया गया है, जिसका उपयोग अंकगणितीय परिचालनों में नहीं किया जा सकता है। यदि आप रुचि रखते हैं, तो फ़ील्ड के प्रकार को बदलने का वर्णन यहाँ किया गया है:MongoDB किसी फ़ील्ड के प्रकार को कैसे बदलें