0

所以............我有一个rails应用程序。rails 应用程序将 Mongoid 用于 mongodb 数据。当我通过 Web 表单创建 mongo 记录时,它们的 ID 为string. 当我使用 mongoimport 将记录导入 mongo 时,它们的 ID 为BSON::ObjectId.

rails 应用程序期望 mongo 记录 ID 是字符串,因此当我导入数据时,它会导致我的应用程序失败,因为当它查找记录时它会抱怨它can't convert type BSON::ObjectId to string

我在这里的许多层面上感到困惑。BSON::ObjectId 是 mongo 中 ID 的默认类型,所以我不明白为什么通过 rails 和 Mongoid 创建的记录有字符串 ID。我没有看到 Mongoid 指定 _id 字段应该是字符串的任何地方。有人有任何线索吗?

4

3 回答 3

2

您使用的是什么版本的 Mongoid?从这篇文章来看,直到一年前,Mongoid 还在使用字符串作为 _id,但现在一直使用 BSON::ObjectId 类型。

mongodb:将对象 ID 转换为 BSON::ObjectId

它引用了这个要点,用于将带有 String _id 的旧文档转换为使用 BSON::ObjectId 类型的 _id。

当 Mongoid 将文档插入到集合中时,它期望并使用 BSON::ObjectId 类型。这是使用 Rails 控制台的示例:

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

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

Post.where(:_id => "4ff5bcb39ef1728393000002").count => 1

Post.where(:_id => BSON::ObjectId("4ff5bcb39ef1728393000002") ).count => 1

您是否有机会手动设置_id?如果是,那么您可能没有将 _id 设置为 BSON::ObjectId 类型。

于 2012-07-05T17:20:38.950 回答
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 文件中的所有数据都已通过我的 rails 环境导入,这意味着我的 mongo 记录具有字符串类型的 _id。谢谢你们的帮助!

于 2012-07-06T13:41:08.853 回答
0

关于您的最后一段:MongoDB 的规范要求使用 12 字节字符串。

于 2012-07-05T14:42:53.820 回答