कोई भी फ़ंक्शन जिसे आप system.js
में सहेजते हैं "JavaScript" प्रोसेसिंग स्टेटमेंट जैसे $where
. के उपयोग के लिए उपलब्ध है ऑपरेटर और mapReduce
और _id
. द्वारा संदर्भित किया जा सकता है मूल्य आवंटित किया गया है।
db.system.js.save({
"_id": "squareThis",
"value": function(a) { return a*a }
})
और कुछ डेटा "नमूना" संग्रह में डाला गया:
{ "_id" : ObjectId("55aafd2bacbed38e06f9eccf"), "a" : 1 }
{ "_id" : ObjectId("55aafea6acbed38e06f9ecd0"), "a" : 2 }
{ "_id" : ObjectId("55aafeabacbed38e06f9ecd1"), "a" : 3 }
फिर:
db.sample.mapReduce(
function() {
emit(null, squareThis(this.a));
},
function(key,values) {
return Array.sum(values);
},
{ "out": { "inline": 1 } }
);
देता है:
"results" : [
{
"_id" : null,
"value" : 14
}
],
या $where
. के साथ :
db.sample.find(function() { return squareThis(this.a) == 9 })
{ "_id" : ObjectId("55aafeabacbed38e06f9ecd1"), "a" : 3 }
लेकिन "न तो" मामले में आप डेटाबेस db
. जैसे ग्लोबल्स का उपयोग कर सकते हैं संदर्भ या अन्य कार्य। दोनों $where
और mapReduce
दस्तावेज़ीकरण में आप यहाँ क्या कर सकते हैं इसकी सीमाओं की जानकारी है। इसलिए यदि आपको लगता है कि आप "किसी अन्य संग्रह में डेटा देखें" जैसा कुछ करने जा रहे हैं, तो आप इसे भूल सकते हैं क्योंकि यह "अनुमति नहीं है"।
हर MongoDB कमांड एक्शन वास्तव में है वैसे भी "रनकमांड" एक्शन "हुड के तहत" के लिए एक कॉल। लेकिन जब तक वह आदेश वास्तव में "जावास्क्रिप्ट प्रोसेसिंग इंजन को कॉल करना" नहीं कर रहा है, तब तक उपयोग अप्रासंगिक हो जाता है। वैसे भी कुछ ही कमांड हैं जो ऐसा करते हैं, जैसे mapReduce
, group
या eval
, और निश्चित रूप से $where
. के साथ खोज संचालन ।
एकत्रीकरण ढांचा नहीं . करता है किसी भी तरह से जावास्क्रिप्ट का प्रयोग करें। हो सकता है कि आप वैसे ही गलती कर रहे हों जैसे दूसरों ने ऐसा बयान दिया है, जो वह नहीं करता जो आपको लगता है कि यह करता है:
db.sample.aggregate([
{ "$match": {
"a": { "$in": db.sample.distinct("a") }
}}
])
तो वह "अंदर नहीं चल रहा है " एकत्रीकरण पाइपलाइन, बल्कि उस .distinct()
. का "परिणाम" सर्वर पर पाइपलाइन भेजे जाने से पहले कॉल का "मूल्यांकन" किया जाता है। वैसे भी जितना बाहरी चर के साथ किया जाता है:
var items = [1,2,3];
db.sample.aggregate([
{ "$match": {
"a": { "$in": items }
}}
])
दोनों अनिवार्य रूप से सर्वर को एक ही तरह से भेजते हैं:
db.sample.aggregate([
{ "$match": {
"a": { "$in": [1,2,3] }
}}
])
इसलिए एग्रीगेशन पाइपलाइन में किसी भी JavaScript फ़ंक्शन को "कॉल" करना "संभव नहीं" है, और न ही वास्तव में system.js
में सहेजी गई किसी चीज़ से परिणाम "गुजरने" का कोई बिंदु है। . "कोड" को "क्लाइंट पर लोड" करने की आवश्यकता है और केवल एक जावास्क्रिप्ट इंजन ही वास्तव में इसके साथ कुछ भी कर सकता है।
एकत्रीकरण ढांचे के साथ, उपलब्ध सभी "ऑपरेटर" वास्तव में मूल रूप से कोडित फ़ंक्शन हैं, जो कि mapReduce
के लिए प्रदान की गई "फ्री फॉर्म" जावास्क्रिप्ट व्याख्या के विपरीत हैं। . इसलिए "जावास्क्रिप्ट" लिखने के बजाय, आप स्वयं ऑपरेटरों का उपयोग करते हैं:
db.sample.aggregate([
{ "$group": {
"_id": null,
"sqared": { "$sum": {
"$multiply": [ "$a", "$a" ]
}}
}}
])
{ "_id" : null, "sqared" : 14 }
इसलिए system.js में सहेजे गए कार्यों के साथ आप क्या कर सकते हैं इसकी सीमाएं हैं, और संभावना है कि आप जो करना चाहते हैं वह या तो है:
- अनुमति नहीं है, जैसे किसी अन्य संग्रह से डेटा एक्सेस करना
- वास्तव में आवश्यक नहीं है क्योंकि तर्क आमतौर पर वैसे भी स्वयं निहित होता है
- या शायद क्लाइंट लॉजिक या किसी अन्य रूप में बेहतर तरीके से लागू किया गया हो
केवल एकमात्र व्यावहारिक उपयोग के बारे में जो मैं वास्तव में सोच सकता हूं कि आपके पास कई "मैपरेडस" ऑपरेशन हैं जो किसी अन्य तरीके से नहीं किए जा सकते हैं और आपके पास विभिन्न "साझा" फ़ंक्शन हैं जिन्हें आप सर्वर पर स्टोर करने के बजाय प्रत्येक के भीतर बनाए रखना चाहते हैं mapReduce फ़ंक्शन कॉल।
लेकिन फिर से, एकत्रीकरण ढांचे पर mapReduce का 90% कारण आमतौर पर यह है कि संग्रह की "दस्तावेज़ संरचना" को खराब तरीके से चुना गया है और खोज और विश्लेषण के लिए दस्तावेज़ को पार करने के लिए जावास्क्रिप्ट कार्यक्षमता "आवश्यक" है।
तो आप इसे अनुमत बाधाओं के तहत उपयोग कर सकते हैं, लेकिन ज्यादातर मामलों में आपको शायद इसका उपयोग बिल्कुल नहीं करना चाहिए, लेकिन अन्य मुद्दों को ठीक करना चाहिए जिससे आपको लगता है कि आपको इस सुविधा की पहली जगह की आवश्यकता है।