2012-09-25 31 views

回答

1

重構本身很簡單。只需將「embed_one」替換爲「has_one」(或將適當的術語替換爲您的映射器庫)即可。數據遷移會導致一些痛苦。或者也許不會。這是一個小小的紅寶石劇本,我在10分鐘之內匆匆而過。它應該涵蓋我認爲你需要的東西。

source_collection = 'users' 
field_to_expand = 'address' 
parent_field = 'user_id' 
expanded_collection = 'addresses' 

require 'mongo' 

db = Mongo::Connection.new.db('test') 
users = db.collection(source_collection) 
addresses = db.collection(expanded_collection) 


# prepare test data 
users.remove() 
addresses.remove() 

users.insert({name: 'Joe', address: {city: 'Rio de Janeiro'}}) 
users.find().to_a # => [{"_id"=>BSON::ObjectId('50614e910ed4c08a6a000001'), "name"=>"Joe", "address"=>{"city"=>"Rio de Janeiro"}}] 


users.find().each do |u| 
    # move subdocument to a separate collection 
    addr = u[field_to_expand] 
    addr[parent_field] = u['_id'] 
    addresses.insert(addr) 

    # erase from original document 
    users.update({_id: u['_id']}, {'$unset' => {field_to_expand => 1}}) 
end 

users.find().to_a # => [{"_id"=>BSON::ObjectId('50614e910ed4c08a6a000001'), "name"=>"Joe"}] 
addresses.find().to_a # => [{"_id"=>BSON::ObjectId('50614e910ed4c08a6a000002'), "city"=>"Rio de Janeiro", "user_id"=>BSON::ObjectId('50614e910ed4c08a6a000001')}] 
相關問題