2015-10-10 10 views
36

के माध्यम से मोंगो सरणी में पुश आइटम पुश करें तो मैंने जवाब की तलाश में बहुत अच्छा लगा है, लेकिन मुझे यकीन है कि मैं सही शब्दों के लिए खो गया हूं जो कि मैं बाद में हूं।मोंगोज़

मूल रूप से मैं एक MongoDB संग्रह कहा जाता है 'लोगों' कि वसूली के लिए स्कीमा है इस प्रकार है:

people: { 
     name: String, 
     friends: [{firstName: String, lastName: String}] 
     } 

अब, मैं एक बहुत ही बुनियादी एक्सप्रेस आवेदन डेटाबेस से कनेक्ट करता है और सफलतापूर्वक 'लोगों बनाता है 'एक खाली दोस्तों सरणी के साथ।

आवेदन में द्वितीयक स्थान पर, मित्रों को जोड़ने के लिए एक फॉर्म मौजूद है। फ़ॉर्म पहले नाम और अंतिम नाम में और फिर नाम फ़ील्ड के साथ POSTs को उचित लोगों के ऑब्जेक्ट के संदर्भ में लेता है।

मुझे जो मुश्किल समय हो रहा है वह एक नया मित्र वस्तु बना रहा है और फिर इसे मित्र सरणी में "धक्का" दे रहा है।

मुझे पता है कि जब मैं इसे मोंगो कंसोल के माध्यम से करता हूं तो मैं लुकअप मानदंड के बाद अपने दूसरे तर्क के रूप में $ push के साथ अद्यतन फ़ंक्शन का उपयोग करता हूं, लेकिन मुझे ऐसा करने के लिए मोंगोस प्राप्त करने का उचित तरीका नहीं दिख रहा है।

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}}); 

अद्यतन: तो, एड्रियन जवाब काफी मददगार था। मेरा लक्ष्य पूरा करने के लिए मैंने निम्नलिखित किया है।

मेरी app.js फ़ाइल में

, मैं एक अस्थायी मार्ग का उपयोग कर

app.get('/addfriend', users.addFriend); 

जहाँ मेरे users.js में दाखिल मैं

exports.addFriend = function (req, res, next) 
{ 
var friend = {"firstName": req.body.fName, "lastName": req.body.lName}; 
Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}}); 
}; 
+0

मुझे लगता है कि मैं संभावित रूप से संग्रह का उपयोग कर सकता हूं। FindOneAndUpdate(), लेकिन मुझे यकीन नहीं है कि मैं इसे कहां कार्यान्वित करूँगा? मेरे मॉडल में? – Neurax

उत्तर

71

मानते हुए है, var friend = { firstName: 'Harry', lastName: 'Potter' };

वहाँ दो हैं सेट आपके पास विकल्प हैं:

मॉडल को स्मृति में अपडेट करें, और सहेजें (सादा जावास्क्रिप्ट सरणी .push):

person.friends.push(friend); 
person.save(done); 

या

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } }, 
    done 
); 

मैं हमेशा कोशिश करते हैं और जब भी संभव हो, पहला विकल्प के लिए जाना है क्योंकि यह लाभ है कि नेवला आप (हुक, सत्यापन, आदि देता है की अधिक सम्मान करता हूँ ।)।

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

+0

मैंने सोचा कि दूसरा विकल्प वास्तव में समवर्ती लेखन सुरक्षा के मामले में सुरक्षित था? क्या आपने गलती से बाद में कहा था जब आप पूर्व कहने का मतलब रखते थे? –

+5

हां, मैंने अभी जांच की है और (नवंबर 2017 में), ** यह _IS_ सुरक्षित ** मोंगोस 'अपडेट' फ़ंक्शन का उपयोग करने के लिए, जबकि ** यह _IS NOT_ सुरक्षित ** दस्तावेज़ खोजने के लिए, इसे स्मृति में संशोधित करें, और उसके बाद दस्तावेज़ पर '.save()' विधि को कॉल करें।जब मैं कहता हूं कि एक ऑपरेशन 'सुरक्षित' है, तो इसका मतलब है कि दस्तावेज़ में एक, दो, या 50 परिवर्तन लागू किए जा रहे हैं, फिर भी वे सभी सफलतापूर्वक लागू किए जाएंगे और अपडेट के व्यवहार की अपेक्षा की जाएगी। अनिवार्य रूप से इन-मेमोरी मैनिपुलेशन असुरक्षित है क्योंकि आप पुराने दस्तावेज़ पर काम कर रहे हैं, इसलिए जब आप सहेजते हैं, तो fetch चरण खो जाने के बाद जो परिवर्तन हुए हैं। –

+2

@ ब्रिकर के लिए एक सामान्य वर्कफ़्लो है जो आपके तर्क को एक पुनः प्रयास लूप में लपेटना है: (पुनः प्रयास करने योग्य, संशोधित, सहेजना शामिल है)। यदि आप एक संस्करण त्रुटि (आशावादी ताला अपवाद) वापस प्राप्त करते हैं, तो आप उस ऑपरेशन को कुछ बार फिर से कोशिश कर सकते हैं और प्रत्येक बार एक नई प्रति प्राप्त कर सकते हैं। मैं तब भी परमाणु अद्यतन पसंद करता हूं, हालांकि! –

संबंधित मुद्दे