Tantangan Anda berasal dari fakta bahwa Prop_Info harus diambil oleh kedua kueri. Hal ini membuat sulit untuk mengetahui koleksi Mongo mana yang harus digunakan.
Di MongoDB, Anda membuat skema dokumen Anda dengan tujuan ideal untuk satu dokumen memiliki semua informasi yang Anda butuhkan dengan pola kueri Anda. Jika Anda perlu memiliki data yang sama D (seperti Prop_Info dalam kasus Anda) dikembalikan oleh dua kueri terpisah terhadap dua koleksi terpisah A dan B , Anda harus memilih di antara tiga strategi berikut:
-
Duplikat
Ddalam dokumen keduanyaAdanB, dan terapkan konsistensi dengan kode Anda. Ini biasanya merupakan pilihan desain sistem kinerja tinggi yang ingin menghilangkan kebutuhan untuk kueri kedua bahkan jika itu harus mengorbankan kompleksitas kode tambahan di sisi penyisipan/pembaruan dan dengan beberapa masalah konsistensi potensial karena Mongo bukan ACID. -
Masukan
DdiAdan simpan referensi (DBRef atau kombinasi bidang pengenal lainnya) diBsehingga Anda dapat melakukannya dengan kueri kedua. Ini biasanya merupakan pilihan desain ketika jumlah kueri keAmelebihi jumlah kueri keB. Itu membuatDlokal ke koleksi yang lebih sering ditanyakan. Dalam pola desain skema ini Anda hanya perlu membuat kueri kedua saat Anda membuat kueriB. -
Masukan
Ddalam koleksi baruCdan buat kueri kedua dari keduanyaAdanB. Ini biasanya merupakan pilihan desain dalam menghadapi persyaratan masa depan yang sangat tidak pasti di mana tidak jelas apa pertukarannya jika Anda menggunakan (1) atau (2) di atas. Ini adalah skema yang paling "seperti relasional" dan skema yang akan memaksa Anda untuk membuat kueri kedua saat Anda menanyakan keduanyaAdanB.
Strategi mana yang Anda pilih bergantung pada domain Anda, pola kueri, dukungan yang Anda dapatkan dari kerangka kerja pemetaan relasional objek (ORM) (jika Anda menggunakannya), dan yang terakhir, preferensi Anda.
Dalam situasi yang saya temui, saya tidak pernah memilih (3). Saya telah menggunakan (1) dalam situasi kinerja tinggi (sistem analitik). Saya telah menggunakan (2) di tempat lain karena pola akses kueri telah memperjelas di mana data "bersama" seharusnya berada.
Setelah Anda memilih strategi, jika Anda masih memerlukan bantuan, kirimkan pertanyaan SO lain yang secara khusus berfokus pada masalah desain skema dengan strategi yang dipilih.
Tiga kiat terakhir:
-
Jika data yang dibagikan
Dmemiliki multiplisitas hubungan lebih besar dari 1 menggunakan array. Anda dapat mengindeks seluruh array dan Anda dapat melakukan kueri secara tepat di dalam array menggunakan$elemMatch. -
Untuk memperbarui
Ddalam strategi (1) atau (2) gunakan pengubah atom dari MongoDB operasi , banyak di antaranya dirancang untuk beroperasi pada array. -
Pertanyaan BEGITU mencakup pola kueri dua DBRef dalam jawaban @ Stennie. (@Stennie bekerja untuk 10gen, penanda MongoDB.)
Semoga beruntung!