我有一個嵌入文檔的mongomapper文檔,並且希望複製它。Mongomapper:將文檔複製到新文檔中
從本質上講,我試圖做的是這樣的:
customer = Customer.find(params[:id])
new_customer = Customer.new
new_customer = customer
new_customer.save
所以我想有兩個不同的mongomapper文件結束,但相同的內容。
任何想法如何做到這一點?
我有一個嵌入文檔的mongomapper文檔,並且希望複製它。Mongomapper:將文檔複製到新文檔中
從本質上講,我試圖做的是這樣的:
customer = Customer.find(params[:id])
new_customer = Customer.new
new_customer = customer
new_customer.save
所以我想有兩個不同的mongomapper文件結束,但相同的內容。
任何想法如何做到這一點?
要完成此操作,您需要更改_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
在新的記錄,所以我可以跟蹤誰從誰得到的,但它是沒有必要的。
不錯,我可以看到我可以如何將您創建的新ID與我處理嵌入文檔的方式相結合,即爲文檔及其嵌入文檔的新副本添加新的ID。 – futureshocked
我不認爲有可能(或有效)在mongodb/mongomapper中創建現有文檔的副本,因爲在我看來,文檔/嵌入文檔及其原始文檔的ID會發生衝突並複製文件。
因此,我通過將文檔內容複製到新文檔而不是文檔本身來解決了我的問題。這裏是一個樣本:
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
這實際上在我的情況下工作得很好。但我很好奇,如果人們有不同的解決方案。
你應該僅僅是能夠做到這一點:
duplicate_doc = doc.clone
duplicate_doc.save
從一個小閱讀中,我已經做了,我在父文檔中嵌入文檔的身影做到這一點的唯一方法是進行循環,得到他們的屬性,通過爲每個屬性複製這些屬性來創建新文檔,直到我擁有該文檔的副本。任何人都可以想到另一種方式? – futureshocked