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
D
dalam dokumen keduanyaA
danB
, 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
D
diA
dan simpan referensi (DBRef atau kombinasi bidang pengenal lainnya) diB
sehingga Anda dapat melakukannya dengan kueri kedua. Ini biasanya merupakan pilihan desain ketika jumlah kueri keA
melebihi jumlah kueri keB
. Itu membuatD
lokal ke koleksi yang lebih sering ditanyakan. Dalam pola desain skema ini Anda hanya perlu membuat kueri kedua saat Anda membuat kueriB
. -
Masukan
D
dalam koleksi baruC
dan buat kueri kedua dari keduanyaA
danB
. 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 keduanyaA
danB
.
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
D
memiliki 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
D
dalam 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!