sql >> Base de Datos >  >> NoSQL >> MongoDB

Documento de clonación profunda con asociaciones incrustadas

No necesita llamar a .clone en esto, puede usar los datos sin procesar de attributes . Por ejemplo, el siguiente método/ejemplo proporcionará nuevas identificaciones en todo el documento si encuentra una.

def reset_ids(attributes)
    attributes.each do |key, value|
        if key == "_id" and value.is_a?(BSON::ObjectId)
            attributes[key] = BSON::ObjectId.new
        elsif value.is_a?(Hash) or value.is_a?(Array)
            attributes[key] = reset_ids(value)
        end        
    end
    attributes
end


original = Car.find(old_id)
car_copy = Car.new(reset_ids(original.attributes))

Y ahora tienes una copia de Car. Sin embargo, esto es ineficiente, ya que tiene que pasar por todo el hash del registro para averiguar si hay algún documento incrustado en un documento incrustado. Sería mejor que restableciera la estructura usted mismo si sabe cómo será, por ejemplo, si tiene partes incrustadas en el automóvil, entonces puede hacer lo siguiente:

original = Car.find(old_id)
car_copy = Car.new(original.attributes)
car_copy._id = BSON::ObjectId.new
car_copy.parts.each {|p| p._id = BSON::ObjectId.new}

Lo cual es mucho más eficiente que simplemente hacer un reinicio genérico.