MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mode d'emploi :l'utilisateur a des fans

Que diriez-vous d'une association auto-référentielle :

class User
  include Mongoid::Document
  references_many :fans, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :fan_of

  references_many :fan_of, 
                  :class_name => 'User', 
                  :stored_as => :array, 
                  :inverse_of => :fans
end

# let's say we have users: al, ed, sports_star, movie_star    
sports_star.fans << al
movie_star.fans << al
sports_star.fans << ed
movie_star.fans << ed

movie_star.fans  # => al, ed
al.fan_of        # => sports_star, movie_star

Le problème est que vous essayez de faire une association relationnelle en utilisant uniquement des documents intégrés. Lorsque vous avez un Fan intégré dans un User , vous ne pouvez accéder qu'au Fan via son parent User . Vous ne pouvez pas faire quelque chose comme Fan.find(some_id) car il n'y a pas de collection de Fan enregistrements.

A terme, MongoDB prendra en charge les collections virtuelles qui vous permettront de le faire. Pour l'instant, vous devez utiliser des associations de type relationnel. Si vous souhaitez utiliser des documents intégrés dans ce cas, vous devez créer des méthodes personnalisées laides et inefficaces pour rechercher dans les enregistrements parents.

Avec MongoDB et Mongoid, j'ai constaté que vous pouvez basculer facilement entre les associations intégrées et relationnelles. Les relations de type SQL et les relations intégrées ont toutes deux leur place et peuvent être utilisées ensemble avec beaucoup d'effet.