2015-09-17 4 views
1

BSON::ObjectId.from_string(params[:_id])BSON ObjectID из строки

Я учусь Синатру, и я получаю BSON::InvalidObjectId Exception: illegal ObjectId format как ошибка. Я передал ему фактические строки вместо переменной, но он продолжает бросать ошибку. Почему метод from_string не принимает "stringy" в качестве аргумента.

get "/venue/:_id" do 
    object_id = BSON::ObjectId.from_string(params[:_id]) 
    @venue = VENUES.find_one({ :_id => object_id }) #VENUES is my coll 
    haml :venue 
end 

ответ

0

В MongoDB ObjectId - это конкретный формат данных, содержащий определенную информацию, содержащуюся в нем. Информация, которую он содержит, отображается в шестнадцатеричном формате при выводе в виде строки.

Ваша строка ввода "stringy" не является шестнадцатеричным представлением и никогда не может гарантировать объединение в действительный ObjectId, это отклоняется.

Проверка, используемая в рубиновом драйвере MongoDB, чтобы проверить, может ли строка быть преобразована в ObjectId (что должно быть то, что использует Sinatra), доступно on github. Вы можете узнать больше о том, что составляет объект MongoDB ObjectId в their documentation.

+0

Благодарим за это; однако я прочитал большинство своих документов на 'from_string', и не сразу видно, как я могу получить доступ к одной конкретной модели из URL-адреса, если это не работает. Учебное пособие, которое я выполняю, имеет эту точную строку кода для страницы с показом модели [ссылка на учебник] (http://spf13.com/presentation/building-your-first-mongodb-app-oscon-2012/), особенно слайд 106. Как еще я должен извлечь документ из db? – Jeff

0

Если я правильно понимаю, что у вас есть идентификатор mongodb как строка, и вам нужен соответствующий объект из базы данных.

Итак, как насчет: res = coll.find(:_id => BSON::ObjectId(id)).first где id - это идентификатор как строка.

Вот мой полный рабочий пример:

require 'mongo' 
include Mongo 

Mongo::Logger.logger.level = ::Logger::FATAL 

db = Client.new([ "localhost:27017" ], :database => "db") 
coll = db[:testCollection] 
coll.insert_one("paramA" => "xyz", "paramB" => "dsafdsaf") 
coll.insert_one("paramA" => "1234", "paramB" => "111111") 

obj = coll.find(:paramA => "1234").first 

p "your id as string" 
id = obj[:_id].to_s 
p id 

p "result" 
res = coll.find(:_id => BSON::ObjectId(id)).first 
p res 

Использование Монго версии 2.1.0. (Что действительно важно, так как они сильно меняют синтаксис)

Лично я использую mongomapper, так как это намного проще с ORM-картой, но это зависит от вас.

+0

Спасибо, но я действительно хотел использовать целочисленный идентификатор, чтобы ссылаться на документ в самой коллекции. Например, используя SQL, я бы написал '@venue = Venue.find (params [: id])' однако, я не могу сделать то же самое без специального знания самого объекта объекта BSON. [Ссылка на учебник] (http://spf13.com/presentation/building-your-first-mongodb-app-oscon-2012/), за которым я слежу, здесь. Все объяснит, если вы можете взглянуть на него. – Jeff

+0

Oo теперь я смущен - не могли бы вы обновить свой вопрос, как выглядит ваш код (класс места, ваш маршрут синатра), но это должно быть это -> 'obj = coll.find (: paramA =>" 1234 "). first' –

+0

@Jeff и ваша версия mongo - 2.1.0? –

Смежные вопросы