sql >> Databáze >  >> NoSQL >> MongoDB

Hluboký klon dokumentu s vloženými asociacemi

Na to nemusíte volat .clone, můžete použít nezpracovaná data z attributes . Například níže uvedená metoda/příklad poskytne nová ID v celém dokumentu, pokud nějaké najde.

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 nyní máte kopii Car. To je však neefektivní, protože musí projít celým hashem, aby se zjistilo, zda jsou ve vloženém dokumentu nějaké vložené dokumenty. Bylo by lepší, kdybyste strukturu resetovali sami, pokud víte, jak to bude, například pokud máte součástky zabudované do auta, pak můžete jednoduše:

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ž je mnohem efektivnější než jen provést obecný reset.



  1. Jak se měří $maxDistance v MongoDB?

  2. MongoDB:nelze upsert, pokud objekt dotazu a objekt aktualizace obsahují stejnou vlastnost, 'Nelze použít modifikátor $addToSet na non-array'

  3. Reverzní stránkování prostřednictvím seřazené sady Redis

  4. Použití funkce MongoDB .findOne() s vnořenou hodnotou dokumentu