MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Documento di clonazione profonda con associazioni incorporate

Non è necessario chiamare .clone su questo, puoi utilizzare i dati grezzi da attributes . Ad esempio, il metodo/esempio seguente fornirà nuovi ID in tutto il documento se ne trova uno.

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))

E ora hai una copia di Car. Tuttavia, questo è inefficiente in quanto deve passare attraverso l'intero hash affinché il record possa capire se sono presenti documenti incorporati in un documento incorporato. Faresti meglio a ripristinare tu stesso la struttura se sai come sarà, ad esempio, se hai una parte incorporata nell'auto, puoi semplicemente fare:

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}

Il che è molto più efficiente di un semplice ripristino generico.