MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Document de clonage en profondeur avec associations intégrées

Vous n'avez pas besoin d'appeler .clone pour cela, vous pouvez utiliser les données brutes des attributes . Par exemple, la méthode/l'exemple ci-dessous donnera de nouveaux identifiants dans tout le document s'il en trouve un.

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

Et vous avez maintenant une copie de Car. Ceci est cependant inefficace car il doit parcourir tout le hachage pour que l'enregistrement détermine s'il y a des documents intégrés dans un document intégré. Vous feriez mieux de réinitialiser la structure vous-même si vous savez comment ce sera, par exemple, si vous avez des pièces intégrées dans la voiture, alors vous pouvez simplement faire :

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}

Ce qui est bien plus efficace qu'une simple réinitialisation générique.