2011-03-09 19 views
5

मेरे पास एम्बेडेड दस्तावेज़ों के साथ एक मोंगोमापर दस्तावेज़ है, और इसकी प्रतिलिपि बनाना चाहते हैं।मोंगोमापर: दस्तावेज़ को एक नए दस्तावेज़ में कॉपी करें

संक्षेप में, मैं क्या करने की कोशिश कर रहा हूँ कुछ इस तरह है:

customer = Customer.find(params[:id]) 
new_customer = Customer.new 
new_customer = customer 
new_customer.save 

तो मैं दो अलग अलग mongomapper दस्तावेजों के साथ खत्म करना चाहते हैं, लेकिन समान सामग्री वाले।

कोई विचार यह कैसे किया जाना चाहिए?

+0

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

उत्तर

4

इसे पूरा करने के लिए, आपको _id को बदलने की आवश्यकता है। उसी _id वाले दस्तावेज़ों को एक ही दस्तावेज़ माना जाता है, इसलिए एक अलग _id के साथ दस्तावेज़ सहेजने से एक नया दस्तावेज़ तैयार होगा।

customer = Customer.find(params[:id]) 
customer._id = BSON::ObjectId.new # Change _id to make a new record 
    # NOTE: customer will now persist as a new document like the new_document 
    # described in the question. 
customer.save # Save the new object 

एक के रूप में अलग रूप में, मैं तो मैं कौन कौन से व्युत्पन्न का ट्रैक रखने के सकता है, लेकिन यह आवश्यक नहीं है नया रिकॉर्ड में कहीं पुराने _id स्टोर करने के लिए इच्छुक हो जाएगा।

+0

अच्छा, मैं देख सकता हूं कि मैं एम्बेडेड दस्तावेजों से निपटने के तरीके के साथ नए आईडी के निर्माण को कैसे जोड़ सकता हूं, यानी दस्तावेज़ की नई प्रतियां और उसके एम्बेडेड दस्तावेज़ों को उनके नए आईडी दें। – futureshocked

0

मुझे नहीं लगता कि यह संभव है (या वैध) mongodb/mongomapper में किसी मौजूदा दस्तावेज़ की प्रतियां बनाने के लिए क्योंकि ऐसा लगता है कि दस्तावेज़/एम्बेडेड दस्तावेज़ों और मूल के उनके आईडी और दस्तावेजों की प्रतिलिपि बनाई।

इसलिए मैंने दस्तावेज़ों की सामग्री को दस्तावेजों की बजाय नए दस्तावेज़ों में कॉपी करके मेरी समस्या हल की। यहां एक नमूना है:

inspection = Inspection.find(params[:inspection_id]) #old document 
new_inspection = Inspection.create     #new target document 
items = inspection.items        #get the embedded documents from inspection 

items.each do |item|         #iterate through embedded documents 
    new_item = Item.create       #create a new embedded document in which 
                 # to copy the contents of the old embedded document 
    new_item.area_comment = item.area_comment   #Copy contents of old doc into new doc 
    new_item.area_name = item.area_name 
    new_item.area_status = item.area_status 
    new_item.clean = item.clean 
    new_item.save          #Save new document, it now has the data of the original 
    new_inspection.items << new_item     #Embed the new document into its parent 
    end 

new_inspection.save         #Save the new document, its data are a copy of the data in the original document 

यह वास्तव में मेरे परिदृश्य में बहुत अच्छा काम करता है। लेकिन अगर लोग एक अलग समाधान करते हैं तो मैं उत्सुक हूं।

4

आप बस यह करने के लिए सक्षम होना चाहिए: एक छोटे से पढ़ने मेरे द्वारा की गई से

duplicate_doc = doc.clone 
duplicate_doc.save 
संबंधित मुद्दे