2013-11-27 68 views
3

我有一個mongodb數據庫,我使用mongoid通過rails 3應用程序訪問。該數據庫由大約10-15個集合組成。這些集合中的一些文檔具有嵌入式文檔,其他文​​檔通過id鏈接。在Mongo數據庫中克隆文檔

我需要克隆數據庫中的大部分數據以創建新記錄。當我們的客戶翻譯這些新記錄時,需要與他們的克隆對象共存。這些新記錄必須保持與以前相同的關係,然而新克隆的記錄需要指向新克隆的對應記錄。

注意事項包括:有一些關係具有需要在克隆上更新的「外鍵」。一些文件嵌入了需要與父母一起克隆的文件。無論如何,克隆文檔將無法與其克隆文檔相關聯。

考慮的解決方案:第一種選擇是複製數據庫並嘗試合併不需要克隆的所有內容。可能會有點混亂,我認爲現有的ID也會被克隆。我考慮的第二個選擇是編寫一個腳本,它可以遍歷每個Mongoid文檔類並調用clone,但是我發現monogid.clone做了一個淺拷貝而不是一個深沉的苦差事。所以對於這個解決方案,我將不得不寫一個案例,其中嵌入關係檢測到以執行深層複製。這也可能變得混亂。

有沒有我在這裏沒有考慮過的選項?有沒有更好的方法去解決其中一種考慮的解決方案?我反對嗎?

+0

我覺得你對這個雜亂的版本感到困惑,這幾乎是我在MongoDB中需要複製東西時所做的。 –

+0

嘿@ muistooshort你的意思是使用.clone? – Stewart

+0

如果'clone'沒有處理嵌入式文檔,那麼就會變得混亂,然後全部手動完成。我傾向於通過手工完成,但我沒有使用Mongoid。 –

回答

0

看着評論中的討論,我會說,如果.clone不起作用,您可以使用屬性read_attribute,write_attribute方法以簡潔的方式輕鬆完成此操作。 Excerpt from here

# Get the field values as a hash. 
person.attributes 

# Set the field values in the document. 
Person.new(first_name: "Jean-Baptiste", middle_name: "Emmanuel") 
person.attributes = { first_name: "Jean-Baptiste", middle_name: "Emmanuel" } 
person.write_attributes(
    first_name: "Jean-Baptiste", 
    middle_name: "Emmanuel" 
)