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

Effektiv måde at gemme data i MongoDB:indlejrede dokumenter vs individuelle dokumenter

Det ville være bedre at bruge den første tilgang (individuelle dokumenter) og bruge en begrænset samling, hvis det er muligt, da du ikke ønsker at have hurtigt voksende samling (mongoid vil have understøttelse af begrænsede samlinger i 2.2, som ville være ude i weekenden I gæt).

Den anden tilgang (indlejrede dokumenter), skal du først hente roddokumentet til brugeren og derefter krydse arrayet i applikationen for at finde den aktivitet, der er relateret til det indlæg, du leder efter. Mongoid kan få det til at se ud som om alt er udført i db på grund af syntaksens lighed i at finde et indlejret dokument, men det gentager virkelig arrayet.

Da du allerede har bruger-id, aktivitets-id og aktivitetstype, før du laver en forespørgsel, og du ikke ønsker, at hele listen over aktiviteter for brugeren skal hentes fra db, når du leder efter en bestemt aktivitet, vil jeg foretrække første tilfælde. Der ville være meget færre beregninger (søgning) i applikationen, og der vil være meget mindre netværkstrafik.

Med tilgang til individuelle dokumenter ville det være fantastisk, hvis du også opretter et unikt indeks på user_id, activity_id, activity_type. Det vil hjælpe dig med at indeholde antallet af dokumenter. Du kan have entydighedsvalideringen (ekstra forespørgsel), men det ville for det meste være unødvendigt, hvis du har det unikke indeks. Den eneste fordel ved validering vil være en valideringsfejl, hvis der er dubletter, men indekset vil ignorere duplikerede indtastninger i ro og mag, medmindre du fortsætter i sikker tilstand.

Hvis du også ønsker, at den historiske webstedsaktivitet skal bevares, kan du have strukturen som:

class SiteActivity
  include Mongoid::Document
  include Mongoid::Timestamps
  belongs_to :user
  belongs_to :activity, polymorphic: true

  index [:user_id, :activity_id, :activity_type], :background => true, :unique => true

  field :last_access_time, :type => Time
  # last_access_times just here for history, not used
  field :last_access_times, :type => Array, :default => []
end

activity = SiteActivity.find_or_initialize_by(:user_id => current_user.id,
               :activity_id => post.id, :activity_type => post.class)
time = Time.now.utc
activity.last_access_time = time
activity.last_access_times << time
activity.save


  1. Mongoose versionering:hvornår er det sikkert at deaktivere det?

  2. hvordan kontrollerer man, om mongodb er oppe og klar til at acceptere forbindelser fra bash-script?

  3. Django + Pymongo oprettelse af kontobekræftelseslink

  4. Konfigurer Jedis timeout