sql >> Databasteknik >  >> NoSQL >> MongoDB

Så här gör du:Användaren har fans

Vad sägs om en självrefererande förening:

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

Problemet är att du försöker göra relationell association med endast inbäddade dokument. När du har en Fan inbäddad i en User , kan du bara komma åt Fan genom dess överordnade User . Du kan inte göra något som Fan.find(some_id) eftersom det inte finns någon samling av Fan uppgifter.

Så småningom kommer MongoDB att stödja virtuella samlingar som låter dig göra detta. För tillfället måste du använda relationsliknande associationer. Om du vill använda inbäddade dokument i det här fallet måste du skapa några fula och ineffektiva anpassade metoder för att söka igenom överordnade poster.

Med MongoDB och Mongoid har jag upptäckt att du enkelt kan växla mellan inbäddade och relationella associationer. Relationer av SQL-typ och inbäddade relationer har båda sin plats och kan användas tillsammans med stor effekt.




  1. MongoDB $atanh

  2. Hur använder jag anslutningspooler korrekt i Redis?

  3. Hur väljer man två tabellvärden (dokument) åt gången efter användar-id i mongoose?

  4. Aggregate $lookup returnerar inte elementens ursprungliga arrayordning