2014-02-07 89 views
0

是否可以識別字符串是否被格式化爲BSON ObjectID是否可以識別字符串的格式?

對於字符串,我們可以這樣做:

"hello".is_a?(String) # => true 

,因爲對象ID這是行不通的是一個String反正。但是有可能分析字符串以確定它是否被格式化爲BSON ObjectID?

通常,ObjectID具有這種格式。

52f4e2274d6f6865080c0000 

格式化標準是stated in the docs

的ObjectId是一個12字節的BSON類型,使用構造:

表示自Unix紀元秒一個4字節的值,
一個3字節的機器標識符,
一個2字節的進程ID,以及一個3字節的計數器,從一個隨機值開始。

+4

是否有任何12字節的十六進制字符串,其*不*是有效的BSON對象ID? – Gareth

+0

你在使用mongoid嗎? – ram

+0

@ram是的,我使用Mongoid。 –

回答

2

任何24個chararcters長十六進制字符串,是一個有效的BSON對象ID,所以你可以使用這個正則表達式來檢查它:

'52f4e2274d6f6865080c0000' =~ /\A\h{24}\z/ 
# => 0 

兩者moped(由mongoid使用)和bson寶石(由mongo_mapper使用)在legal?方法封裝此檢查:

require 'moped' 
Moped::BSON::ObjectId.legal?('00' * 12) 
# => true 


require 'bson' 
BSON::ObjectId.legal?('00' * 12) 
# => true 
2

Mongoid使用:.is_a?(Moped::BSON::ObjectId) sytanx。

例子:

some_id = YourModel.first.id 
some_id.is_a?(Moped::BSON::ObjectId) 

注:

「52d7874679478f45e8000001」 .is_a(字符串)#打印真正

+0

如果我在模型中嘗試此操作,則會得到一個'未初始化的常量Moped :: BSON'錯誤。 –

+0

Mongoid版本?檢查爲寶石列表| grep'mongoid'。 – ram

+0

我得到它的工作。但我認爲這種方法對我不起作用。原因是我想重寫模型中的find()方法。所以'find(「52f4e21e4d6f686786000000」)'因爲查找器正在傳遞一個字符串,它總是會計算爲false。 –

相關問題