2011-03-15 20 views
7

मैं अपने सिर को खरोंच कर रहा हूं, सामान्य रूप से यह नोड परियोजनाओं के साथ लगता है, और मुझे यकीन नहीं है कि मैं कुछ गलत कर रहा हूं या यदि मैं एक बग में चला गया हूं।मोंगोस एम्बेडेड दस्तावेज़ों को नहीं हटाएगा

मुझे सर्वर की एक स्कीमा मिली है जिसमें सेवाओं नामक एम्बेडेड दस्तावेज़ों की संख्या हो सकती है। हालांकि मैं एक समस्या में भाग रहा हूं, हालांकि, मैंने सर्वर ऑब्जेक्ट से व्यक्तिगत सेवा को सफलतापूर्वक हटा दिया है, जब भी मैं इसे सहेजने के लिए कहता हूं, इसे डेटाबेस से नहीं हटाता है। सेव फ़ंक्शन काम कर रहा है क्योंकि यह मेरे द्वारा किए गए किसी भी बदलाव को सहेज रहा है और नए एम्बेडेड डॉक्स में भी धक्का दे रहा है, यह सिर्फ पहले से मौजूद नहीं है।

app.put('/server/:id', function(req, res, next){ 
    app.Server.findOne({_id: req.params.id}, function(err, server) { 
    server.updated = new Date(); 
    ... 

    for (var num = _.size(req.body.server.services) - 1; num >= 0; num--){ 
     // Is this a new service or an existing one 
     if (server.services[num]) { 
     // Is it marked for deletion? If so, delete it 
     if (req.body.server.services[num].delete == "true") { 
      server.services[num].remove() 
     } else { // else, update it 
      server.services[num].type = req.body.server.services[num].type 
      ... 
     } 
     } else { 
     // It's new, add it 
     delete req.body.server.services[num]["delete"] 
     server.services.push(req.body.server.services[num]); 
     } 
    } 

    server.save(function(err){ 
     if (!err) { 
     req.flash('success', 'Server updated') 
     } else { 
     req.flash('error', 'Err, Something broke when we tried to save your server. Sorry!') 
     console.log(err) 
     } 
     res.redirect('/') 
    }); 
    }) 
}); 

तो निकालें() वास्तव में सेवा को हटा रहा है:

यहाँ मेरी कोड की एक अपेक्षाकृत सरल उदाहरण है। अगर मैं सहेजने से पहले server.toObject() करता हूं, तो यह वहां नहीं है। कोई विचार यह डेटाबेस से इसे हटाए जाने पर क्यों नहीं हटाएगा?

संपादित करें: मुझे लगता है कि संस्करण संख्या उपयोगी होगी। [email protected], [email protected] [email protected]

+0

मुझे एक ही समस्या है। – Carlosedp

उत्तर

3

मुझे इस समस्या को अस्थायी रूप से ठीक करने का एक तरीका मिला।

मैंने जो किया वह एम्बेडेड दस्तावेज़ों को एक सरणी में लोड करता है, हटाए जाने के लिए एक को विभाजित करता है और सरणी को प्रतिस्थापित करता है। कुछ इस तरह:

var oldusers = dl.users; 
oldusers.splice(dl.users.indexOf(req.currentUser.id), 1); 
dl.users = oldusers; 
dl.save(function(err) {... 

मुझे पता है कि दस्तावेज़ के आकार के आधार पर कहीं भी होगी

+0

उसने ऐसा किया। धन्यवाद! – mattmcmanus

+0

यह काम करता है, लेकिन क्या किसी को पता है कि हमें इसे वर्कअराउंड के रूप में क्यों उपयोग करना है? –

4

के बाद से मैं अपने उदाहरण का परीक्षण नहीं किया गया है मैं गलत हो सकता है, लेकिन नेवला तरह का पता लगाने के नहीं है यह लगता है कि एम्बेडेड दस्तावेज़ संशोधित है।

schema types documentation page से

:

चूंकि यह एक स्कीमा-कम प्रकार है, आप कुछ और आप की तरह करने के लिए मूल्य बदल सकते हैं, लेकिन नेवला ऑटो का पता लगाने/उन परिवर्तनों को बचाने के लिए क्षमता खो देता है। मोंगोस को "बताना" कि मिश्रित प्रकार का मान बदल गया है, उस मिश्रित प्रकार के पथ को पारित करने वाले दस्तावेज़ के .markModified (पथ) कॉल को कॉल करें।

person.anything = { x: [3, 4, { y: "changed" }] }; 
person.markModified('anything'); 
person.save(); // anything will now get saved 

तो आप मार्कमोडिफाइड() फ़ंक्शन का उपयोग करने के समान सरल हो सकते हैं।

+1

मार्कमोडिफाइड बच्चों पर काम नहीं करने के अलावा यह सही होगा। देखें: https://github.com/LearnBoost/mongoose/issues/435 – k00k

+0

मेरे मामले में काम किया। आपका बहुत बहुत धन्यवाद! – JMax

+0

कार्लोस्ड का समाधान केवल कुछ हद तक परिदृश्यों में मेरे लिए काम करता था। यह हर जगह काम करता प्रतीत होता है और यह "सही" विधि प्रतीत होता है। धन्यवाद! –