我的数据结构如下:
{
"_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
答案 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_id
和some_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
没有关心我正在做什么事。