Sebagai penggemar berat mongodb, saya sarankan Anda menggunakan database relasional untuk data yang sangat relasional - untuk itulah basis data dibuat. Anda kehilangan semua manfaat mongodb ketika Anda harus melakukan 3+ kueri untuk mendapatkan satu objek.
Buuuuuut , Saya tahu bahwa komentar akan jatuh di telinga tuli. Taruhan terbaik Anda adalah sesadar mungkin tentang kinerja. Langkah pertama Anda adalah membatasi bidang ke minimum yang diperlukan. Ini hanya praktik yang baik bahkan dengan kueri dasar dan apa saja mesin basis data - hanya dapatkan bidang yang Anda butuhkan (mis. SELECT * FROM
===buruk... hentikan saja!). Anda juga dapat mencoba melakukan kueri ramping untuk membantu menghemat banyak pekerjaan pasca-pemrosesan yang dilakukan luwak dengan data. Saya tidak menguji ini, tetapi seharusnya berhasil...
SchemaA.find({}, 'field1 fieldB', { lean: true })
.populate({
name: 'fieldB',
select: 'fieldC',
options: { lean: true }
}).exec(function (err, result) {
// not sure how you are populating "result" in your example, as it should be an array,
// but you said your code works... so I'll let you figure out what goes here.
});
Juga, cara yang sangat "mongo" untuk melakukan apa yang Anda inginkan adalah menyimpan referensi di SchemaC kembali ke SchemaA. Ketika saya mengatakan cara "mongo" untuk melakukannya, Anda harus melepaskan diri dari pemikiran Anda selama bertahun-tahun tentang kueri data relasional. Lakukan apa pun yang diperlukan untuk melakukan lebih sedikit kueri pada database, meskipun memerlukan referensi dua arah dan/atau duplikasi data.
Misalnya, jika saya memiliki skema Buku dan skema Penulis, saya kemungkinan akan menyimpan nama depan dan belakang penulis dalam koleksi Buku, bersama dengan referensi _id ke profil lengkap dalam koleksi Penulis. Dengan begitu saya dapat memuat Buku saya dalam satu kueri, tetap menampilkan nama penulis, dan kemudian membuat hyperlink ke profil penulis:/author/{_id}
. Ini dikenal sebagai "denormalisasi data", dan telah diketahui membuat orang mulas. Saya mencoba dan menggunakannya pada data yang tidak terlalu sering berubah - seperti nama orang. Jika sebuah nama berubah, menulis fungsi untuk memperbarui semua nama di banyak tempat adalah hal yang sepele.