Akan lebih baik menggunakan pendekatan pertama (dokumen individual) dan menggunakan koleksi yang dibatasi jika memungkinkan, karena Anda tidak ingin memiliki koleksi yang berkembang pesat (mongoid akan memiliki dukungan untuk koleksi yang dibatasi di 2.2, yang akan keluar akhir pekan ini saya tebak).
Pendekatan kedua (dokumen yang disematkan), Anda harus terlebih dahulu mengambil dokumen root untuk pengguna dan kemudian melintasi larik dalam aplikasi untuk menemukan aktivitas yang terkait dengan pos yang Anda cari. Mongoid mungkin membuatnya tampak seperti semuanya dilakukan dalam db karena kesamaan sintaks dalam menemukan dokumen yang disematkan, tetapi itu benar-benar mengulangi array.
Karena Anda sudah memiliki user_id, activity_id dan activity_type sebelum membuat kueri, dan Anda tidak ingin seluruh daftar aktivitas untuk pengguna diambil dari db ketika Anda mencari aktivitas tertentu, saya akan memilih kasus pertama. Akan ada lebih sedikit perhitungan (pencarian) dalam aplikasi dan lalu lintas jaringan akan jauh lebih sedikit.
Dengan pendekatan dokumen individual, alangkah baiknya jika Anda juga membuat indeks unik pada user_id, activity_id, activity_type. Ini akan membantu Anda memuat jumlah dokumen. Anda dapat memiliki validasi keunikan (permintaan tambahan), tetapi itu sebagian besar tidak perlu jika Anda memiliki file index. Satu-satunya manfaat validasi adalah kesalahan validasi jika ada duplikat, tetapi indeks akan mengabaikan entri duplikat secara diam-diam kecuali Anda tetap dalam mode aman.
Jika Anda juga ingin aktivitas situs historis dipertahankan, Anda dapat memiliki struktur seperti:
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