MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

कस्टम फ़ंक्शन परिकलित कॉलम मोंगोडब प्रोजेक्शन

आपको लगता है कि एकत्रीकरण पाइपलाइन में जावास्क्रिप्ट फ़ंक्शन को कॉल करना संभव है, लेकिन आप ऐसा नहीं कर सकते। आप गलत कर रहे हैं कि पाइपलाइन के भीतर निष्पादन के लिए फ़ंक्शन परिणाम से एक चर का वास्तव में "प्रक्षेपण" क्या है।

उदाहरण के लिए यदि मैं ऐसा करता हूं:

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
}

तो यह "फ़ील्ड वैल्यू में कैसे पास करें" के बारे में नहीं है, बल्कि वास्तव में इस तथ्य के बारे में है कि एकत्रीकरण ढांचा किसी भी तरह से जावास्क्रिप्ट का समर्थन नहीं करता है, और जो आपने सोचा था वह वास्तव में ऐसा नहीं है।




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoexport ई QUERY सिंटैक्स त्रुटि:अनपेक्षित पहचानकर्ता

  2. MongoDB में किसी दिनांक से कार्यवृत्त प्राप्त करने के 5 तरीके

  3. क्या मोंगोडब को एम्बेडेड डेटाबेस के रूप में इस्तेमाल किया जा सकता है?

  4. मोंगो खोल के माध्यम से mongoDB में नेस्टेड सरणियों को अद्यतन कर रहा है

  5. मोंगोडीबी $dayOfWeek