MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Deep-Clone-Dokument mit eingebetteten Assoziationen

Sie müssen dafür nicht .clone aufrufen, Sie können die Rohdaten von attributes verwenden . Zum Beispiel gibt die folgende Methode/das folgende Beispiel neue IDs im gesamten Dokument aus, wenn es eine findet.

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

Und Sie haben jetzt eine Kopie von Car. Dies ist jedoch ineffizient, da der gesamte Hash für den Datensatz durchlaufen werden muss, um herauszufinden, ob es eingebettete Dokumente in einem eingebetteten Dokument gibt. Sie sollten die Struktur besser selbst zurücksetzen, wenn Sie wissen, wie es sein wird, zum Beispiel, wenn Sie ein Teil in ein Auto eingebettet haben, dann können Sie einfach Folgendes tun:

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}

Das ist viel effizienter als nur ein generisches Zurücksetzen.