sql >> Databáze >  >> NoSQL >> MongoDB

Efektivní způsob ukládání dat v MongoDB:vložené dokumenty vs jednotlivé dokumenty

Bylo by lepší použít první přístup (jednotlivé dokumenty) a použít omezenou kolekci, pokud je to možné, protože nechcete mít rychle rostoucí kolekci (mongoid bude mít podporu pro omezené kolekce ve verzi 2.2, která by měla vyjít tento víkend I hádejte).

Druhý přístup (vložené dokumenty), budete muset nejprve načíst kořenový dokument pro uživatele a poté procházet pole v aplikaci, abyste našli aktivitu související s příspěvkem, který hledáte. Mongoid může vypadat, jako by se vše dělalo v db kvůli podobnosti syntaxe při hledání vloženého dokumentu, ale ve skutečnosti to iteruje pole.

Protože už máte user_id, activity_id a activity_type před zadáním dotazu a nechtěli byste, aby byl celý seznam aktivit pro uživatele načten z db, když hledáte konkrétní aktivitu, budu preferovat první případ. V aplikaci by bylo mnohem méně výpočtů (vyhledávání) a byl by mnohem menší provoz v síti.

S přístupem jednotlivých dokumentů by bylo skvělé, kdybyste také vytvořili jedinečný index na user_id, activity_id, activity_type. Pomůže vám obsahovat počet dokumentů. Můžete mít ověření jedinečnosti (dodatečný dotaz), ale to by bylo většinou zbytečné, pokud máte jedinečný index. Jedinou výhodou ověření bude chyba ověření, pokud existují duplikáty, ale index bude duplicitní položky ignorovat tiše, pokud nezůstanete v nouzovém režimu.

V případě, že chcete, aby byla zachována i historická aktivita na webu, můžete mít strukturu jako:

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. Jak mohu vytvořit dotaz s mongoose z funkce pomocí parametru?

  2. Je ideální, když MongoDB používá 150 MB paměti?

  3. Je MongoDB ChangeStream ResumeToken celosvětově jedinečný?

  4. Mapreduce v nativním ovladači mongodb ruby