2013-06-04 6 views
5

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

उदाहरण के लिए

। मान लें कि मेरे पास निम्नलिखित फ़ील्ड के साथ एक मौजूदा संग्रह है। संग्रह की

नाम: Ticket

{profile: {name: "Test", placement: 1}, requestor: _id} 

जब मैं इस तरह इस संग्रह के लिए/अद्यतन क्षेत्रों जोड़ने का प्रयास:

var ticket = Meteor.tickets.findOne({_id: ticketID}); 

if(ticket){ 
    Meteor.users.update(ticket, { 
         $set: profile: {name: "Test2", new_fields: "value"} 
        }); 
} 

संग्रह अद्यतन हो जाता है और नाम क्षेत्र में परिवर्तन लेकिन प्लेसमेंट निकाल दिया जाता है और अब वहाँ नहीं है। यह भी सच है अगर मैं name फ़ील्ड को हटा देता हूं। हम एक ही संरचना को पार करने के बिना एक उल्का संग्रह को सही ढंग से कैसे अपडेट करते हैं?

$set: {"profile.name": "Test2", "profile.new_fields": "value"} 

यानी:

उत्तर

9

बस ऐसा करने आप पूरे हैश को बदल रहे थे। इसके बजाय आप हैश के भीतर फ़ील्ड अपडेट कर सकते हैं।

+0

जैसे ही आप इसे पोस्ट कर रहे थे, मुझे यह मिला। http://stackoverflow.com/questions/10290621/how-do-i-partially-update-an-object-in-mongodb-so-the-new-object-will-overlay। कुछ मिनटों में स्वीकार करेंगे। धन्यवाद – Warz

0

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

db.artists.find() 

{"_id":ObjectId("1"),"name":"A1","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

db.artists.ensureIndex({"name":1}) 

db.artists.update(
    {name:"A1"}, 
    {$set: { name:"A4"}}, 
    { upsert: true } 
    ) 

b.artists.find() 

{"_id":ObjectId("1"),"name":"A4","media_id":["m1","m2" ]} 

{"_id":ObjectId("2"),"name":"A2","media_id":["m2","m3"]} 

{"_id":ObjectId("3"),"name":"A3","media_id":["m3","m1","m2"]} 

मैं स्वयं मोंगोडीबी में काफी नया हूं लेकिन यह मेरे लिए बहुत अच्छा काम करता है।

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