是否可以识别字符串的格式?

时间:2014-02-07 14:07:29

标签: ruby mongoid bson

是否可以识别字符串是否格式化为BSON ObjectID

对于我们可以做的字符串:

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

这不起作用,因为ObjectID仍然是一个String。但是有可能分析字符串以确定它是否格式化为BSON ObjectID?

通常,ObjectID具有这种格式。

  52f4e2274d6f6865080c0000

格式标准为stated in the docs

  

ObjectId是一个12字节的BSON类型,使用:

构造      

一个4字节的值,表示自Unix时代以来的秒数,
  一个3字节的机器标识符,
  一个2字节的进程ID,和
  一个3字节的计数器,以随机值开始。

2 个答案:

答案 0 :(得分:2)

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

示例:

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

注意:

“52d7874679478f45e8000001”.is_a?(String)#Prints true

答案 1 :(得分:2)

任何24个chararcters长十六进制字符串都是有效的BSON对象ID,因此您可以使用此正则表达式进行检查:

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

moped(由mongoid使用)和bson(由mongo_mapper使用)gems都将此检查封装在legal?方法中:

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


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