Решение и устранение проблем с MongoDB / Mongoid ID - PullRequest
0 голосов
/ 17 марта 2012

Это связано с другим вопросом StackOverflow год назад.Но немного по-другому.

Это в Ruby / Mongoid: 2.2.6.

Когда я начал работать с MongoDB, похоже, что мы неправильно сохранили идентификатор документа MongoDb, потому что простая находка по идентификаторуне работает, но возвращает документ, когда мы запускаем запрос where для других атрибутов.

Я попытался "сбросить" поле id с помощью объекта, возвращенного из where, и установить "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"=>[]}

У него нет ObjectId для поля идентификатора.Не уверен, как это так обанкротилось, но так оно и есть.

Код, который я использую для его изменения:

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

Я сделал это с помощью своей консоли.Вы можете точно видеть, что я делаю.

Будем благодарны за любые мысли.

https://gist.github.com/2087011

Ответы [ 2 ]

2 голосов
/ 17 марта 2012
Поле

_id является неизменным.Вы должны вставить новый документ с новым значением _id и удалить старый.

0 голосов
/ 20 марта 2012

В Mongoid существует задача rake для преобразования ObjectIds.

Если вы используете это, у вас будет зеркало вашей коллекции. Затем просто переименуйте, и вы будете настроены.

Будет ошибка, если у вас есть дубликаты object_ids, поэтому вам может понадобиться запустить его несколько раз.

И это МЕДЛЕННО.

...