BSON::ObjectId.from_string(params[:_id])
我正在学习Sinatra,我一直将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 :(得分:0)
在MongoDB中,ObjectId是一种特定的数据格式,其中包含特定的信息。当以字符串形式输出时,它包含的信息以十六进制格式显示。
您的输入字符串" stringy"不是十六进制表示,并且永远不能保证合并为有效的ObjectId,这被拒绝。
MongoDB ruby驱动程序中使用的检查是否可以将字符串转换为ObjectId(应该是Sinatra正在使用的字符串)on github。您可以在their documentation中了解有关构成MongoDB ObjectId的更多信息。
答案 1 :(得分:0)
如果我理解你,你有一个mongodb id作为字符串,你需要数据库中的相应对象。
那么怎么样: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
使用mongo版本 2.1.0 。 (这非常重要,因为他们非常重视语法)
我个人使用mongomapper,因为使用ORM映射器会更简单,但这取决于您。