mongodb: преобразование идентификаторов объектов в BSON :: ObjectId - PullRequest
1 голос
/ 06 июля 2011

Мы недавно обновили наше приложение до Rails3, и теперь мы используем Mongoid, и у нас возникла проблема с получением предыдущих документов из mongo-db на _id.

При более тщательном изучении старая запись (которую я не могу извлечь по _id) выглядит следующим образом:

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: "4d892bfe6bcaff4ffd000001", ... }>

и хорошая запись имеет следующую структуру:

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: BSON::ObjectId('4d892bfe6bcaff4ffd000001'), ... }>

Как видите, поле _id отличается. Для старых записей это, кажется, просто строка, а для новых записей это BSON::ObjectID.

Кажется, я не могу получить записи в старом формате. Попытка найти записи, используя

Audit::Log.where(:_id => BSON::ObjectId('4d892bfe6bcaff4ffd000001')).first
Audit::Log.where(:_id => '4d892bfe6bcaff4ffd000001').first

оба возвращают nil.

Но для хорошей записи я могу просто сделать

Audit::Log.where(:'_id' => '4e14152d6bcaff26bb000039').first

Я предполагаю, но, возможно, Mongoid автоматически преобразует строку в ObjectId для поиска по _id? Единственное исправление, которое я вижу, это преобразовать все поля _id до BSON::ObjectId, если их еще нет. Но как мне это сделать?

Или у вас есть лучший подход?

Ответы [ 3 ]

7 голосов
/ 06 июля 2011

Все это будет работать, при условии, что запись действительно существует:

Account.where(:_id => "4e0a9c6142f5bc769f000008").first
Account.find(BSON::ObjectId("4e0a9c6142f5bc769f000008"))
Account.find("4e0a9c6142f5bc769f000008")

Я заинтересован в том, чтобы JSON вернул насчет Audit :: Log ... Почему возвращаются два поля _id?

#<Audit::Log _id: 4d892bfe6bcaff4ffd000001, 
    failed: nil, request_id: "68ccb38e9e345bb7fc55331389a902a1", 
    session_id: "54940ff7e8c7336d813a872db7cb7bc0", 
    _id: "4d892bfe6bcaff4ffd000001", ... }>

Вы можете перейти к драйверу Монго и посмотреть, действительно ли этот журнал существует в базе данных.Если вы не объявите другое поле "_id" в audit_log.rb, я считаю, что эта запись не существует.

0 голосов
/ 28 сентября 2012

Пример: вот идентификатор 1.9.3-p125: 096> profile_id => «4fe969dd79216d0af9000002 ″ 1.9.3-p125: 099> BSON :: ObjectId.from_string (profile_id) => BSON :: ObjectId ('4fe969dd79216d0af9000002)

0 голосов
/ 06 июля 2011

Ха, я должен был посмотреть дальше на Mongoid документацию.У них есть раздел, описывающий , как обновить .В разделе, посвященном обновлению до 2.0.0.BETA.11 +, они описывают, что _id больше не являются String и указывают на эту гист для преобразования всех ваших идентификаторов из * 1007.* до ObjectId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...