MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Głęboko sklonuj dokument z osadzonymi skojarzeniami

Nie musisz w tym celu wywoływać .clone, możesz użyć surowych danych z attributes . Na przykład poniższa metoda/przykład da nowe identyfikatory w całym dokumencie, jeśli je znajdzie.

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

A teraz masz kopię Car. Jest to jednak nieefektywne, ponieważ musi przejść przez cały skrót, aby rekord mógł ustalić, czy w osadzonym dokumencie znajdują się jakiekolwiek osadzone dokumenty. Lepiej byłoby samodzielnie zresetować strukturę, jeśli wiesz, jak to będzie, na przykład, jeśli masz części wbudowane w samochód, możesz po prostu zrobić:

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}

Co jest o wiele bardziej wydajne niż zwykły reset.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zapisywanie, organizowanie i odpytywanie produktów, opcji/tagów i kategorii

  2. Błąd walidacji Mongodb

  3. Jak uzyskać dostęp do MongoDB

  4. mangusta findById przy użyciu asynchronicznego oczekiwania

  5. Mongodb na serwerze linux