sql >> データベース >  >> NoSQL >> MongoDB

関連付けが埋め込まれたディープクローンドキュメント

    これで.cloneを呼び出す必要はありません。attributesからの生データを使用できます。 。たとえば、以下のメソッド/例では、ドキュメントが見つかった場合、ドキュメント全体で新しいIDが提供されます。

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

    そして、あなたは今、車のコピーを持っています。ただし、埋め込みドキュメントに埋め込みドキュメントがあるかどうかを判断するためにレコードのハッシュ全体を調べる必要があるため、これは非効率的です。構造がどのようになるかがわかっている場合は、自分で構造をリセットすることをお勧めします。たとえば、車に部品が埋め込まれている場合は、次のようにするだけです。

    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}
    

    これは、一般的なリセットを実行するよりもはるかに効率的です。



    1. マングースプライベートチャットメッセージモデル

    2. MongoDBの_idタイプを整数に変更するのは悪いことですか?

    3. MongoDBドキュメント操作はアトミックで分離されていますが、一貫性がありますか?

    4. ScrapyとMongoDBを使用したWebスクレイピング