आपको लगता है कि एकत्रीकरण पाइपलाइन में जावास्क्रिप्ट फ़ंक्शन को कॉल करना संभव है, लेकिन आप ऐसा नहीं कर सकते। आप गलत कर रहे हैं कि पाइपलाइन के भीतर निष्पादन के लिए फ़ंक्शन परिणाम से एक चर का वास्तव में "प्रक्षेपण" क्या है।
उदाहरण के लिए यदि मैं ऐसा करता हूं:
var getNumbers = function() { return [ 1,2,3 ] };
फिर मैं इसे कॉल करता हूं:
db.collection.aggregate([
{ "$project": {
"mynums": getNumbers()
}}
])
फिर जावास्क्रिप्ट शेल में वास्तव में क्या होता है, मान "इंटरपोलेटेड" और "इससे पहले" सर्वर को निर्देश भेजे जाते हैं, जैसे:
db.collection.aggregate([
{ "$project": {
"mynums": [1,2,3]
}}
])
इसे और प्रदर्शित करने के लिए, सर्वर पर "केवल" फ़ंक्शन संग्रहीत करें:
db.system.js.save({ "_id": "hello", "value": function() { return "hello" } })
फिर एग्रीगेशन स्टेटमेंट चलाने की कोशिश करें:
db.collection.aggregate([
{ "$project": {
"greeting": hello()
}}
])
और इसके परिणामस्वरूप एक अपवाद होगा:
<ब्लॉककोट>E QUERY [मुख्य] संदर्भ त्रुटि:हैलो को (खोल) पर परिभाषित नहीं किया गया है:1:69
ऐसा इसलिए है क्योंकि निष्पादन "क्लाइंट" पर हो रहा है न कि "सर्वर" पर और फ़ंक्शन क्लाइंट पर मौजूद नहीं है।
एकत्रीकरण ढांचा नहीं जावास्क्रिप्ट चलाएं, क्योंकि इसमें ऐसा करने का कोई प्रावधान नहीं है। सभी ऑपरेशन मूल कोड में किए जाते हैं, जिसमें कोई जावास्क्रिप्ट इंजन नहीं लगाया जाता है। इसलिए आप इसके बजाय वहां ऑपरेटरों का उपयोग करते हैं:
db.collection.aggregate([
{ "$project": {
"total": { "$add": [ 1, 2 ] },
"field_total": { "$subtract": [ "$gross", "$tax" ] }
}}
])
यदि आप परिणामों को प्राप्त करने के लिए ऑपरेटरों का उपयोग नहीं कर सकते हैं तो आप जावास्क्रिप्ट कोड को चलाने का एकमात्र तरीका मैपरेडस को चलाना है, जो निश्चित रूप से संग्रह से डेटा के साथ इंटरफेस करने के लिए जावास्क्रिप्ट इंजन का उपयोग करता है। और वहां से आप अपने लॉजिक के अंदर एक सर्वर साइड फ़ंक्शन को भी संदर्भित कर सकते हैं यदि आपको आवश्यकता हो:
{ "key": 1, "value": 1 },
{ "key": 1, "value": 2 },
{ "key": 1, "value": 3 }
db.system.js.save({ "_id": "square", "value": function(num) { return num * num } })
db.collection.mapReduce(
function() {
emit(this.key,square(this.value))
},
function(key,values) {
return Array.sum(values);
},
{ "out": { "inline": 1 } }
)
रिटर्न:
{
"_id": 1,
"value": 14
}
तो यह "फ़ील्ड वैल्यू में कैसे पास करें" के बारे में नहीं है, बल्कि वास्तव में इस तथ्य के बारे में है कि एकत्रीकरण ढांचा किसी भी तरह से जावास्क्रिप्ट का समर्थन नहीं करता है, और जो आपने सोचा था वह वास्तव में ऐसा नहीं है।