2012-03-17 14 views
0

これは、1年前の別のStackOverflow質問に関連しています。しかし、少し異なります。MongoDB/Mongoid IDの問題の解決と修正

これはRuby/Mongoidにあります:2.2.6。

私はMongoDb文書のIDを誤って保存したように見えますが、IDの単純な検索は機能しませんが、他の属性のwhereクエリを実行するとドキュメントを返すためです。

どこから返されたオブジェクトを使ってidフィールドを "リセット"しようとしましたが、 "id"と "_id"をストアドストリングのBSON :: ObjectIdバージョンに設定しました。このレコードはまだこのフィールドでは照会できないため、これは機能しませんでした。

私はディスクを完全に拭いてから(何ヶ月もの生産データを失う)、やり直す前に他の提案はありますか?

編集:ループ内でリトゥンされ、取り出すことのできないドキュメントの例。

{"_id"=>"4f47267193546d160b0171a2", "attribute_tags"=>[{"tag"=>"website"}, {"tag"=>"twitter"}, {"tag"=>"website"}, {"tag"=>"twitter"}], "contact_info"=>{"facebook"=>[], "success"=>true, "created_at"=>2012-02-24 05:58:06 UTC, "tags"=>[], "twitter"=>[], "email"=>[], "phone"=>[], "linkedin"=>[], "google_plus"=>[], "youtube"=>[], "contact_form"=>false}, "created_at"=>2012-02-24 05:56:01 UTC, "data"=>{"twitter_followers_count"=>112, "twitter_is_translator"=>112, "twitter_protected"=>false, "twitter_url"=>"http://www.bettyunderground.com", "twitter_verified"=>false, "twitter_statuses_count"=>2040, "twitter_listed_count"=>14, "twitter_geo_enabled"=>true, "twitter_friends_count"=>124, "twitter_created_at"=>"Fri Jul 17 21:41:00 +0000 2009", "twitter_contributors_enabled"=>false, "enriched_at"=>2012-02-24 05:58:09 UTC}, "demographics"=>{}, "description"=>"The trials and tribulations of a polemicist", "directory_ids"=>[], "forums"=>[], "found_at_url"=>"http://www.bettyunderground.com", "geographics"=>{"language"=>"en", "location"=>"San Francisco, CA"}, "hashtags"=>{"tag"=>{"website"=>true, "twitter"=>true}, "reachable_via"=>{"twitter"=>true}}, "host_names"=>[], "ignore_project_ids"=>[], "keyword_scores"=>{"return policy"=>0.0}, "keywords"=>["return policy"], "last_contact_info_update"=>2012-02-24 05:58:09 UTC, "name"=>"Betty Underground", "new_profiles"=>[{"service"=>"twitter", "user_id"=>"BettyUndergrnd", "score"=>1.0}, {"service"=>"twitter", "username"=>"BettyUndergrnd", "score"=>1.0}], "presence_score"=>0, "profile_url"=>"http://a2.twimg.com/profile_images/1459407098/image_normal.jpg", "profiles_retrieved"=>true, "references"=>[], "share_counts"=>{}, "tags"=>["website", "twitter"], "twitter"=>"BettyUndergrnd", "updated_at"=>2012-03-17 10:08:09 UTC, "wordsmaster_ids"=>[], "reachable_via"=>[], "read_project_ids"=>[]} 

IDフィールドのObjectIdはありません。それがどうやってこのように逮捕されたのかは分かりませんが、それはそうです。

私はそれを修正するために使用しているコードは次のとおりです。

#if d is the document 
old_id = d._id 
d["_id"] = BSON::ObjectId(old_id) 
d.save 

私は私のコンソールからこれを行うための要点を置いてきました。私がしていることを正確に見ることができます。

どのような考えにも感謝します。

https://gist.github.com/2087011

+0

返されたドキュメントのIDを使用してドキュメントを検索すると、そのドキュメントを見つけることができません。 – xdazz

+0

サンプルドキュメントの表示方法、_idのリセット方法、およびクエリの外観を教えてください。 – Ren

+0

xdazz:はい。ドキュメントコレクションが「エンティティ」と呼ばれる場合、私はできます:Entity.all.each {| x | Entity.find(x.id)}これはドキュメントが見つからないとエラーになります。 Entity.find(x._id)エラーも同様です。 – Williamf

答えて

0

Mongoidには、ObjectIdを変換するためのレーキタスクがあります。

これを使用すると、コレクションのミラーが作成されます。その後、単に名前を変更すると設定されます。

重複するobject_idsがあるとエラーになるので、数回実行する必要があります。

そして、それは遅いです。

2

_idフィールドは不変です。新しい値を_idにして新しい文書を挿入し、古い文書を削除する必要があります。

+0

これは正解と似ています。しかし、関連があるので、それは苦痛です。 – Williamf

+0

@ウィリアムフ:あなたはあまり選択肢がないようです。 –

+0

これを行うにはレーキタスクがあるようです。 objectids_convert。誰もそれを使用しましたか? – Williamf