Perbandingan parameter induk yang digunakan dalam penyelesai Apollo GraphQL lwn. peringkat $lookup dalam pengagregatan MongoDB untuk menyertai model Mongoose
P粉543344381
P粉543344381 2023-09-02 09:22:26
0
2
899
<p>Saya sedang membangunkan aplikasi bahagian belakang menggunakan Apollo GraphQL dan Mongoose. Saya mempunyai dua model: Pengguna dan Pos, yang mempunyai hubungan satu-ke-banyak (seorang pengguna boleh mempunyai berbilang siaran, tetapi satu siaran kepunyaan satu pengguna). </p> <p>Saya ingin menanyakan medan Pengguna dalam skema GraphQL untuk mendapatkan pengguna mengikut ID pengguna dan semua siaran kepunyaan pengguna tersebut. Saya juga ingin menanyakan medan pengarang dalam jenis siaran saya untuk mendapatkan pengguna yang menulis siaran. </p> <p>Saya mengetahui bahawa terdapat dua cara untuk menyertai data daripada koleksi berbeza dalam MongoDB: menggunakan parameter induk dalam penyelesai Apollo GraphQL atau menggunakan peringkat $lookup dalam agregat MongoDB. </p> <p>Parameter induk ialah objek yang mengandungi hasil yang dikembalikan daripada penghurai pada medan induk. Parameter induk boleh digunakan untuk mengakses data daripada medan induk atau menaip dan menghantarnya ke medan atau jenis anak. Sebagai contoh, saya boleh menggunakannya untuk menyertai model mongoose seperti ini: </p> <pre class="brush:php;toolbar:false;">taip Pengguna { saya telah lakukan! nama: String siaran: [Siaran] } taip Post { saya telah lakukan! tajuk: Rentetan pengarang: Pengguna } taip Pertanyaan { pengguna(id: ID!): Pengguna } penyelesai const = { Pengguna: { siaran(induk, hujah, konteks) { kembali context.db.Post.find({ author: parent.id }); }, }, };</pre> <p>Peringkat $lookup ialah peringkat saluran paip pengagregatan yang melakukan gabungan luar kiri ke koleksi lain dalam pangkalan data yang sama. Peringkat $lookup boleh digunakan untuk menggabungkan data daripada berbilang koleksi ke dalam set hasil tunggal. Sebagai contoh, saya boleh menggunakannya untuk menyertai model seperti ini: </p> <pre class="brush:php;toolbar:false;">db.posts .agregat([ { $lookup: { daripada: "pengguna", LocalField: "pengarang", foreignField: "_id", sebagai: "pengarang", }, }, ]) .toArray((err, posts) => { console.log(posts); });</pre> <p>Saya tidak pasti yang mana satu harus saya gunakan untuk aplikasi saya. Saya mahu memilih pilihan yang lebih cekap, berskala dan boleh diselenggara. </p> <p>Apakah perbezaan utama dan pertukaran antara menggunakan parameter induk dalam penyelesai Apollo GraphQL dan menggunakan peringkat $lookup dalam agregasi MongoDB untuk menyertai model Mongoose? </p>
P粉543344381
P粉543344381

membalas semua(2)
P粉081360775

Saya syorkan teknik pertama - pastinya lebih bersih dan mungkin lebih pantas. Anda harus memastikan untuk mengindeks medan author - sama seperti anda mengindeks kunci asing dalam RDB.

P粉676588738

Terdapat beberapa perbezaan antara kedua-dua kaedah ini

Gunakan penghurai

Saya dapati pendekatan ini lebih intuitif dan boleh dibaca, dan oleh itu lebih mudah untuk dikekalkan, terutamanya untuk pertanyaan yang rumit

Walau bagaimanapun, ia mungkin bukan yang paling cekap apabila berurusan dengan jumlah data yang besar, kerana ia akan membuat panggilan tambahan ke pangkalan data untuk setiap medan bersarang. Ini boleh menjadi kesesakan prestasi apabila berurusan dengan sejumlah besar pertanyaan bersarang yang kompleks.

Gunakan $lookup

Sebaliknya, operasi $lookup secara amnya lebih berprestasi kerana mereka menggunakan satu panggilan pangkalan data untuk menyambung dan mendapatkan data.

Walau bagaimanapun, apabila kerumitan pertanyaan meningkat, operasi $lookup boleh menjadi rumit dan sukar untuk dibaca dan diselenggara. Ia mungkin memerlukan lebih banyak pengetahuan tentang bahasa pertanyaan MongoDB dan mungkin tidak semudah dan mudah untuk digunakan sebagai pendekatan penghurai. Agregat yang ditulis dengan buruk boleh menyebabkan masalah prestasi, jadi pastikan anda benar-benar yakin tentang perkara yang anda lakukan.

Jadi dalam contoh anda, saya tidak keberatan menggunakan pendekatan parser, pendekatan pertama akan lebih mudah dibaca/diperbaiki/diselenggara walaupun menggunakan pengagregatan lebih pantas.

Semoga ini membantu:)

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!