आप मानगो क्वेरी द्वारा लौटाए गए डेटा को संशोधित क्यों नहीं कर सकते (उदा: findById)


94

जब मैं एक Mongoose क्वेरी द्वारा दिए गए डेटा के किसी भी हिस्से को बदलने की कोशिश करता हूं तो इसका कोई प्रभाव नहीं होता है।

मैं कल के बारे में 2 घंटे के लिए यह पता लगाने की कोशिश कर रहा था, सभी प्रकार के साथ _.clone(), अस्थायी भंडारण चर का उपयोग कर, आदि, अंत में, बस जब मैं पागल हो रहा था, तो मुझे एक समाधान मिला। इसलिए मुझे लगा कि भविष्य में कोई (fyuuuture!) के पास सहेजने का मुद्दा हो सकता है।

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q; //has no effect

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});


जवाबों:


160

इस तरह के मामलों के लिए जहां आप एक पूर्ण मॉडल उदाहरण के बजाय एक सादे JS ऑब्जेक्ट चाहते हैं, आप lean()क्वेरी श्रृंखला पर कॉल कर सकते हैं जैसे:

Survey.findById(req.params.id).lean().exec(function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

यह तरीका dataपहले से ही एक सादा जेएस वस्तु है जिसे आप अपनी आवश्यकता के अनुसार हेरफेर कर सकते हैं।


8
Btw @JohnnyHK बस फिर से धन्यवाद कहना चाहता था। डेढ़ साल बाद एक क्लाइंट डिबग में कुछ मदद कर रहा था। उन्होंने सप्ताहांत में कुछ जानने की कोशिश में एक सप्ताह बिताया, क्योंकि यह मानगो की वस्तु को संशोधित करने की कोशिश कर रहा था, पी
टोली

1
2 साल बाद और अभी भी इसे कुचल रहा है। दुबला होने का एहसास नहीं था () था।
पेट्रोगैड

1
@ फ़िज़िक्स aggregateहमेशा सादे वस्तुओं के रूप में अपने परिणाम प्रदान करता है, इसलिए इसकी कोई आवश्यकता नहीं है lean()
जॉनीएचके

1
3 साल बाद और पूरे घंटे और इसे जानने की कोशिश में। मेरा पूरा दिन बचा लिया! धन्यवाद
Noy

2
धन्यवाद! इससे वास्तव में मदद मिली, लेकिन वस्तु को संशोधित करना असंभव क्यों है? यह किस प्रकार की विशेष वस्तु है?
राबर्ट फेडुस

46

मुझे लगता है कि मानगो दस्तावेज़ पर्याप्त रूप से स्पष्ट नहीं करता है, लेकिन डेटा क्वेरी में लौटा है (हालाँकि आप इसे res.send () कर सकते हैं) वास्तव में एक Mongoose दस्तावेज़ ऑब्जेक्ट है, और JSON ऑब्जेक्ट नहीं है। लेकिन आप इसे एक लाइन से ठीक कर सकते हैं ...

Survey.findById(req.params.id, function(err, data){
    var len = data.survey_questions.length;
    var counter = 0;

    var data = data.toJSON(); //turns it into JSON YAY!

    _.each(data.survey_questions, function(sq){
        Question.findById(sq.question, function(err, q){
            sq.question = q;

            if(++counter == len) {
                res.send(data);
            }
        });
    });
});

12
आप भी उपयोग कर सकते हैं toObject(), जो एक ही काम करता है toJSON()लेकिन कम भ्रमित नाम के साथ।
जॉनीएचके

1
क्या इससे डेवलपर द्वारा डाले गए वर्चुअल से भी छुटकारा मिलेगा?
mjwrazor

5
TypeError: data.toObject is not a functionमैं के साथ इस, एक ही मिलाtoJSON
Luzan बराल

के संशोधन के बजाय result, मैं संशोधित करने में सक्षम था result._doc
nth-chile

@Luzan बराल थॉट्स क्योंकि आप ऐरे ऑब्जेक्ट के लिए इन फ़ंक्शन का उपयोग कर रहे हैं। JSON.parse(JSON.stringify(data))ऑब्जेक्ट के एरे के लिए उपयोग करें
mohit
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.