sql >> Databasteknik >  >> NoSQL >> MongoDB

Djupt klondokument med inbäddade associationer

Du behöver inte anropa .clone för detta, du kan använda rådata från attributes . Till exempel kommer metoden/exemplet nedan att ge nya ID i hela dokumentet om det hittar ett.

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

Och du har nu en kopia av Bil. Detta är dock ineffektivt eftersom det måste gå igenom hela hashen för att posten ska ta reda på om det finns några inbäddade dokument i ett inbäddat dokument. Du skulle vara bättre att återställa strukturen själv om du vet hur den kommer att bli, till exempel om du har en del inbäddad i bilen, då kan du bara göra:

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}

Vilket är mycket effektivare än att bara göra en generisk återställning.



  1. MongoDB Aggregation PHP, Gruppera efter timmar

  2. Använda en rumslig databas för att hitta polygoner som innehåller en punkt

  3. sql-fråga till mongodb?

  4. findAll misslyckas efter att spelmorphia har återinitierats