sql >> Databasteknik >  >> NoSQL >> MongoDB

Effektivt sätt att lagra data i MongoDB:inbäddade dokument kontra enskilda dokument

Det skulle vara bättre att använda det första tillvägagångssättet (enskilda dokument) och använda en begränsad samling om möjligt, eftersom du inte vill ha snabbt växande samling (mongoid kommer att ha stöd för begränsade samlingar i 2.2, som skulle komma ut i helgen I gissa).

Det andra tillvägagångssättet (inbäddade dokument), måste du först hämta rotdokumentet för användaren och sedan gå igenom arrayen i applikationen för att hitta aktiviteten relaterad till inlägget du letar efter. Mongoid kan få det att se ut som att allt görs i db på grund av likheten i syntaxen när det gäller att hitta ett inbäddat dokument, men det upprepar verkligen arrayen.

Eftersom du redan har användar-id, aktivitets-id och aktivitetstyp innan du gör en förfrågan, och du inte vill att hela listan med aktiviteter för användaren ska hämtas från db när du letar efter en viss aktivitet, kommer jag att föredra första fallet. Det skulle vara mycket mindre beräkningar (sökning) i applikationen och det kommer att bli mycket mindre nätverkstrafik.

Med individuella dokument tillvägagångssätt skulle det vara bra om du också skapar ett unikt index på user_id, activity_id, activity_type. Det hjälper dig att innehålla antalet dokument. Du kan ha unikhetsvalideringen (extra fråga), men det skulle mestadels vara onödigt om du har det unika indexet. Den enda fördelen med validering kommer att vara ett valideringsfel om det finns dubbletter, men index ignorerar dubblettposter tyst om du inte fortsätter i felsäkert läge.

Om du också vill att den historiska webbplatsaktiviteten ska bestå kan du ha 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. Hämta index för ett objekt efter värde i en redis-lista

  2. Hur övervakar man Redis som en kömotor med cli som liknar beanstalkd?

  3. Hur tar man bara bort ett eller två fält från dokument i mongodb?

  4. Hur kan jag ändra/definiera standarddatabas för Mongodb i Spring-data?