sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo hacerlo:el usuario tiene fans

¿Qué tal una asociación autorreferencial:

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

El problema es que está tratando de hacer una asociación relacional utilizando solo documentos incrustados. Cuando tienes un Fan incrustado dentro de un User , solo puedes acceder al Fan a través de su padre User . No puedes hacer algo como Fan.find(some_id) porque no hay colección de Fan registros.

Eventualmente, MongoDB admitirá colecciones virtuales que le permitirán hacer esto. Por ahora, debe usar asociaciones de tipo relacional. Si desea utilizar documentos incrustados en este caso, debe crear algunos métodos personalizados desagradables e ineficientes para buscar en los registros principales.

Con MongoDB y Mongoid, descubrí que puede cambiar fácilmente entre asociaciones integradas y relacionales. Las relaciones de tipo SQL y las relaciones incrustadas tienen su lugar y se pueden usar juntas con gran efecto.