2010-10-16 29 views
4
class Comment 
    include MongoMapper::Document 

    scope :by_rating, lambda { |minimum| where(:rating.gte => minimum) } 

    key :rating 
    belongs_to :user 
end 

class User 
    include MongoMapper::Document 

    many :comments 
end 


User.first.comments.by_rating(3) 

最后一行的查询实际上做了什么? MongoMapper是否足够智能,只用两个WHERE条件(user_id和minimum rating)来执行一个查询?使用MongoMapper作用域查询关联的集合?

回答

1

MongoDB无法做到这一点。这需要一个它不能做的连接。它通过具有非常可扩展的读取性能和轻量级查询来克服此限制。这不是问题。您可以通过在你的初始化设置记录看到此行为(搜索MongoMapper.connection):

# Change as appropriate 
MongoMapper.connection = Mongo::Connection.new(
    '127.0.0.1', 27017, :logger => Logger.new(STDOUT)) 

然后启动你的轨道控制台,你会看到两个查询:

User.first.comments 
MONGODB test['users'].find({}).limit(-1) 
MONGODB test['comments'].find(
    {:user_id=>BSON::ObjectId('4e8ddd6bf2c31e7001000001')})