1
說我有一個現有的數據集,其中東西是一個嵌入式文檔,但我們想要把它變成一個參考。有沒有任何一種自動或半自動的方式來做這個重構。在MongoDB中重構嵌入參考或反向嵌入的最簡單方法是什麼?
說我有一個現有的數據集,其中東西是一個嵌入式文檔,但我們想要把它變成一個參考。有沒有任何一種自動或半自動的方式來做這個重構。在MongoDB中重構嵌入參考或反向嵌入的最簡單方法是什麼?
重構本身很簡單。只需將「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')}]