2014-02-07 61 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。 –

相关问题