0

だから........私はレールアプリを持っています。Rails アプリは、mongodb データに Mongoid を使用します。Web フォームから mongo レコードを作成すると、type の ID がありstringます。mongoimport を使用してレコードを mongo にインポートすると、 type の 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 は 1 年前まで _id に文字列を使用していたようですが、現在は一貫して BSON::ObjectId 型を使用しているようです。

mongodb: オブジェクト ID を BSON::ObjectId に変換する

String _id を持つ古いドキュメントを BSON::ObjectId type _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がレコードの挿入を担当するようにすることでした。CSVファイルを解析し、そのファイルのレコードをアプリ環境に挿入するrakeタスクを作成しました。

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 に答える