2012-07-05 82 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。谢谢你们的帮助!