来自字符串

时间:2015-09-17 03:21:21

标签: mongodb sinatra

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

2 个答案:

答案 0 :(得分:0)

在MongoDB中,ObjectId是一种特定的数据格式,其中包含特定的信息。当以字符串形式输出时,它包含的信息以十六进制格式显示。

您的输入字符串" stringy"不是十六进制表示,并且永远不能保证合并为有效的ObjectId,这被拒绝。

MongoDB rub​​y​​驱动程序中使用的检查是否可以将字符串转换为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映射器会更简单,但这取决于您。