2010-10-16 2 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) 

Que fait réellement la requête sur la dernière ligne? MongoMapper est-il assez intelligent pour exécuter une seule requête avec deux conditions WHERE (user_id et rating minimum)?Interrogation de la collection associée à l'aide des étendues MongoMapper?

Répondre

1

MongoDB ne peut pas faire cela. Cela nécessite une jointure qu'il ne peut pas faire. Il surmonte cette limitation en ayant des performances de lecture très évolutives et des requêtes plus légères. Ce n'est pas un problème. Vous pouvez voir ce comportement en définissant l'enregistreur dans votre initialiseur (recherche MongoMapper.connection):

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

feu ensuite votre console de rails et vous verrez deux requêtes:

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