sql >> Database >  >> NoSQL >> MongoDB

Diep kloondocument met ingesloten associaties

U hoeft hiervoor geen .clone aan te roepen, u kunt de onbewerkte gegevens uit attributes gebruiken . De onderstaande methode/voorbeeld geeft bijvoorbeeld nieuwe id's door het hele document als er een wordt gevonden.

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

En je hebt nu een kopie van Car. Dit is echter inefficiënt omdat het de hele hash moet doorlopen voordat het record kan achterhalen of er ingesloten documenten in een ingesloten document zijn. U kunt de structuur beter zelf resetten als u weet hoe het zal zijn, bijvoorbeeld als u onderdelen in de auto heeft ingebouwd, dan kunt u gewoon het volgende doen:

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}

Dat is een stuk efficiënter dan alleen een algemene reset uitvoeren.



  1. Spring Data MongoDB - $eq binnen $projectondersteuning

  2. Geneste structuren opslaan met mgo

  3. Uitvoeren van db.repairDatabase() van mongodb-native in node.js

  4. Hoe configureer ik mongodb om oude logbestanden te verwijderen?