MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Procedura:l'utente ha dei fan

Che ne dici di un'associazione autoreferenziale:

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

Il problema è che stai cercando di eseguire un'associazione relazionale utilizzando solo documenti incorporati. Quando hai un Fan incorporato all'interno di un User , puoi accedere solo al Fan tramite il suo User genitore . Non puoi fare qualcosa come Fan.find(some_id) perché non esiste una raccolta di Fan record.

Alla fine, MongoDB supporterà raccolte virtuali che ti permetteranno di farlo. Per ora, devi usare le associazioni di tipo relazionale. Se desideri utilizzare i documenti incorporati in questo caso, devi creare dei metodi personalizzati brutti e inefficienti per cercare tra i record principali.

Con MongoDB e Mongoid, ho scoperto che puoi passare facilmente dalle associazioni incorporate a quelle relazionali. Le relazioni di tipo SQL e le relazioni incorporate hanno entrambe il loro posto e possono essere utilizzate insieme con grande efficacia.