2010-10-16 28 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')})