2012-07-05 58 views
0

因此........我有一個Rails應用程序。 rails應用程序使用Mongoid作爲mongodb數據。當我通過網絡表單創建mongo記錄時,他們的ID爲string。當我使用mongoimport將記錄導入到mongo中時,它們具有類型爲BSON::ObjectId的ID。無法將BSON :: ObjectId轉換爲字符串

Rails應用程序期待蒙戈記錄ID是字符串,因此,當我輸入數據時,它會導致我的應用程序失敗,因爲當它查找它抱怨can't convert type BSON::ObjectId to string

我記錄在這裏有很多層次的困惑。 BSON :: ObjectId是mongo中ID的默認類型,所以我不明白爲什麼通過rails和Mongoid創建的記錄具有字符串ID。我沒有看到Mongoid指定的地方,_id字段應該是一個字符串。有人有任何線索嗎?

+0

你使用的是什麼版本的mongoid? – 2012-07-05 15:45:55

+0

所以我想通了。問題在於我的應用程序使用的Mongoid版本。版本1.9.5使用字符串作爲_id字段的默認類型,這正是我正在使用的。最終,我將不得不建立一個rake任務來導入記錄,所以我可以使用Mongoid 1.9.5來創建它們。 感謝您的幫助! – 2012-07-05 16:12:28

回答

2

您使用的是什麼版本的Mongoid?在這篇文章中,看起來像Mongoid直到一年前一直在使用字符串_id,但現在一直使用BSON :: ObjectId類型。

mongodb: converting object ID's to BSON::ObjectId

它引用了這個要點與字符串_id的轉換舊文檔使用BSON ::的ObjectId類型_id的。

當Mongoid將文檔插入到集合中時,它期望並使用BSON :: ObjectId類型。這是使用的Rails控制檯的示例:

交= Post.new =># post.save =>真 post._id => BSON ::的ObjectId( '4ff5bcb39ef1728393000002') 交._id.class => BSON ::的ObjectId

Mongoid似乎知道使用BSON查找_id的::的ObjectId類型:

Post.where(:_ ID => 「4ff5bcb39ef1728393000002」)計數 => 1

Post.where。(:_ ID => BSON ::的ObjectId( 「4ff5bcb39ef1728393000002」)).Count之間 => 1

你有沒有手動設置_id的?如果你是,那麼你可能沒有將_id設置爲BSON :: ObjectId類型。

+0

你是對的。問題在於我使用的mongoid版本。我沒有嘗試轉換現有的mongo文檔並更新mongoid,而是編寫了一個rake任務來將數據導入到我的應用程序環境中。我把它貼在下面。謝謝你的幫助! – 2012-07-06 13:42:36

0

所以我想通了。問題在於我的應用程序使用的Mongoid版本。版本1.9.5使用字符串作爲_id字段的默認類型,這正是我正在使用的。

我想過更新Mongoid,但我擔心舊的字符串ID會以某種方式破壞應用程序。

答案是以某種方式使用rails應用程序導入記錄,以便舊版本的Mongoid負責插入記錄。我創建了一個rake任務,可以解析CSV文件並在該應用程序環境中插入該文件中的記錄。

require 'csv' 
require 'iconv' 
namespace :deadline do 
    desc "Import data from CSV file" 
    task :import => :environment do 
    CSV.parse(File.open("/tmp/deadlines.csv").read).map{ |row| 
     app_deadline = OrgSpecific::ApplicationDeadline.create!(
     :name => row[2] + " " + row[3], 
     :start_date => Date.strptime('1/1/2012', '%m/%d/%Y'), 
     :deadline_date => Date.strptime(row[11], '%m/%d/%Y'), 
     :term => row[2], 
     :year => row[3], 
     :comment => Iconv.conv("UTF8", "LATIN1", row[5]) + " : " + Iconv.conv("UTF8", "LATIN1", row[6]) 
    ) 
    } 
    end 
end 

瞧!我的CSV文件中的所有數據都已通過我的導軌環境導入,這意味着我的mongo記錄具有字符串類型的_id。謝謝你們的幫助!