假设我们有一个名为“images”的 MongoDB 集合,以及一个具有相应“Image”模型的 MongoMapper 驱动的应用程序。如果我们使用此模型设置 MongoMapper 查询,我们会看到它是 typePlucky::Query
并返回 type 的结果Image
:
>> Image.where(:file_type => 'image/jpeg').class
=> Plucky::Query
>> Image.where(:file_type => 'image/jpeg').first.class
=> Image
我们可以直接在 Mongo 适配器上运行相应的查询,主要绕过 MongoMapper,通过访问MongoMapper.connection
. 如果我们这样做,查询是 typeMongo::Cursor
并返回 type 的原始数据结果BSON::OrderedHash
:
>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).class
=> Mongo::Cursor
>> MongoMapper.connection.db(dbname).collection('images').find({ :file_type => 'image/jpeg' }).first.class
=> BSON::OrderedHash
问题是,有没有办法将Plucky::Query
上面的类似内容转换为(或从中检索)一个基本的非扩展Mongo::Cursor
对象?
起初我以为我找到了一个解决方案find_each
,它实际上需要 aPlucky::Query
并返回 a Mongo::Cursor
:
>> Image.where(:file_type => 'image/jpeg').find_each.class
=> Mongo::Cursor
但事实证明,这Mongo::Cursor
以某种方式扩展或与上述不同,因为它仍然返回Image
对象而不是BSON::OrderHash
对象:
>> Image.where(:file_type => 'image/jpeg').find_each.first.class
=> Image
更新:我不能像在第二种情况下那样完全绕过 MongoMapper 查询魔术,因为我需要访问 MongoMapper 的功能(特别是命名范围)来构建查询,所以我最终得到的是Plucky::Query
. 但是我希望结果是纯数据对象,而不是模型,因为我需要的只是数据,我不想要模型实例化的开销。