使用ruby驱动程序查询MongoDB ObjectId

时间:2014-04-03 21:32:20

标签: ruby mongodb

我的数据结构如下:

{ 
  "_id" : ObjectId("533c3ce0ccf205e24fead6b8"), 
  "_class" : "test", 
  "test" : { 
        "_id" : "0502b397-4cd9-4781-bb63-70b96d799cdb", 
        "mongoTestGroups" : [  DBRef("sg", ObjectId("533c3ce0ccf205e24fead6b9")) ] 
  }, 
  "createDate" : ISODate("2014-04-02T16:37:52.175Z") 
}

我正好查询第一个ObjectId。教程/ rdoc并不清楚如何解决这个问题。我目前有:

require 'json'
require 'mongo'
require 'pp'

include Mongo

db = MongoClient.new('localhost').db('mytest')
coll = db.collection('testcollection')

我认为它应该是这样的:

pp coll.find({_id: => { ObjectId("533c3ce0ccf205e24fead6b8")}})

可行的方法是:

pp coll.count

1 个答案:

答案 0 :(得分:0)

您需要使用BSON::ObjectId.from_string将您的ID字符串转换为MongoDB所期望的BSON::ObjectId

coll.find(_id: BSON::ObjectId.from_string('533c3ce0ccf205e24fead6b8'))

那个BSON::ObjectId.from_string调用是相当于在MongoDB shell中调用ObjectId的Ruby。您很快就会发现在整个地方调用BSON::ObjectId.from_string非常麻烦,因此您可能希望将to_bson_id修补为String和NilClass:

class String
  def to_bson_id
    BSON::ObjectId.from_string(self)
  end
end

class NilClass
  def to_bson_id
    self
  end
end

然后你可以说'533c3ce0ccf205e24fead6b9'.to_bson_idsome_string.to_bson_id之类的内容。

如果您还使用Mongoid,MongoMapper或其他ODM,那么您也可以将to_bson_id补丁到其中;例如,使用Mongoid(使用Moped而不是MongoDB的标准接口)我这样做:

class String
  def to_bson_id
    Moped::BSON::ObjectId(self) # This is Moped's version of BSON::ObjectId.from_string
  end
end

module Mongoid
  module Document
    def to_bson_id
      id    
    end 
  end
end

module Moped
  module BSON
    class ObjectId
      def to_bson_id
        self    
      end   
    end 
  end
end

class NilClass
  def to_bson_id
    self
  end
end

所以我可以说:

str.to_bson_id
some_bson_id.to_bson_id
some_odm_object.to_bson_id

没有关心我正在做什么事。