Rumah >Peranti teknologi >industri IT >Menggunakan Join In MongoDB NoSQL Pangkalan Data
mata teras
$lookup
$lookup
(koleksi yang akan disambungkan), localField
(bidang yang boleh didapati dalam koleksi from
) dan foreignField
(nama medan output). Pengendali ini boleh digunakan dalam pertanyaan agregat untuk memadankan jawatan, menyusun mengikut urutan, mengehadkan bilangan item, sambungkan data pengguna, array pengguna meratakan dan mengembalikan hanya medan yang diperlukan. from
as
Walaupun pengendali MongoDB $lookup
$lookup
Salah satu perbezaan terbesar antara pangkalan data SQL dan NoSQL adalah menyertai. Dalam pangkalan data relasi, SQL menyertai klausa membolehkan anda menggabungkan baris dari dua atau lebih jadual menggunakan medan yang sama di antara mereka. Sebagai contoh, jika anda mempunyai jadual buku dan penerbit, anda boleh menulis arahan SQL berikut:
dengan kata lain, jadual buku mempunyai medan penerbit_id yang merujuk medan ID dalam jadual penerbit.
<code class="language-sql">SELECT book.title, publisher.name FROM book LEFT JOIN book.publisher_id ON publisher.id;</code>Ini praktikal kerana penerbit tunggal dapat menyediakan beribu -ribu buku. Jika kita perlu mengemas kini butiran penerbit pada masa akan datang, kita boleh menukar rekod individu. Redundansi data diminimumkan kerana kami tidak perlu mengulangi maklumat penerbit untuk setiap buku. Teknologi ini dipanggil penyeragaman.
pangkalan data SQL menyediakan pelbagai penyeragaman dan kekangan untuk memastikan penyelenggaraan hubungan.
nosql == Tidak bergabung?
Pangkalan data berorientasikan dokumen (seperti MongoDB) direka untuk menyimpan data de-normal. Sebaik -baiknya, tidak ada hubungan antara set. Jika data yang sama perlu dalam dua atau lebih dokumen, ia mesti diulang.
Ini boleh mengecewakan kerana hampir tidak ada keadaan di mana andatidak akan memerlukan data hubungan. Nasib baik, MongoDB 3.2 memperkenalkan pengendali
baru yang boleh melakukan operasi seperti kiri-Join pada dua atau lebih set. Tetapi ada masalah ... $lookup
hanya dibenarkan digunakan dalam operasi agregat. Fikirkannya sebagai saluran paip satu siri pengendali yang memohon, penapis dan hasil kumpulan. Output satu pengendali digunakan sebagai input kepada pengendali seterusnya.
Agregasi lebih sukar difahami daripada pertanyaan carian mudah dan biasanya berjalan lebih perlahan. Walau bagaimanapun, mereka berkuasa dan merupakan pilihan yang berharga untuk operasi carian kompleks.
Adalah lebih baik menggunakan contoh untuk menerangkan pengagregatan. Katakan kami membuat platform media sosial dengan koleksi pengguna. Ia menyimpan butiran setiap pengguna dalam dokumen yang berasingan. Contohnya:
<code class="language-sql">SELECT book.title, publisher.name FROM book LEFT JOIN book.publisher_id ON publisher.id;</code>kita boleh menambah seberapa banyak bidang yang kita mahu, tetapi semua dokumen MongoDB memerlukan medan
dengan nilai yang unik. _id
Sama seperti kunci utama SQL, mereka akan dimasukkan secara automatik jika diperlukan. _id
: user_id
<code class="language-json">{ "_id": ObjectID("45b83bda421238c76f5c1969"), "name": "User One", "email": "userone@email.com", "country": "UK", "dob": ISODate("1999-09-13T00:00:00.000Z") }</code>kami kini ingin memaparkan dua puluh jawatan terakhir yang dinilai "penting" oleh semua pengguna dalam urutan terbalik masa. Setiap dokumen yang dikembalikan hendaklah mengandungi teks, masa jawatan, dan nama dan negara pengguna yang berkaitan.
pertanyaan agregasi MongoDB meluluskan pelbagai operator saluran paip yang menentukan setiap operasi dalam urutan. Pertama, kita perlu menggunakan penapis
untuk mengekstrak semua dokumen dengan penilaian yang betul dari koleksi pos: $match
<code class="language-json">{ "_id": ObjectID("17c9812acff9ac0bba018cc1"), "user_id": ObjectID("45b83bda421238c76f5c1969"), "date": ISODate("2016-09-05T03:05:00.123Z"), "text": "My life story so far", "rating": "important" }</code>kita kini perlu menyusun item yang sepadan dengan urutan terbalik dengan menggunakan pengendali
: $sort
<code class="language-javascript">{ "$match": { "rating": "important" } }</code>Oleh kerana kita hanya memerlukan dua puluh jawatan, kita boleh menggunakan peringkat
supaya MongoDB hanya perlu memproses data yang kita mahu: $limit
<code class="language-javascript">{ "$sort": { "date": -1 } }</code>kini kita boleh menggunakan operator
baru untuk menyambungkan data dari koleksi pengguna. Ia memerlukan objek dengan empat parameter: $lookup
localField
from
foreignField
from
as
<code class="language-javascript">{ "$limit": 20 }</code>Ini akan mewujudkan medan baru dalam output kami yang dipanggil
. Ia mengandungi array di mana setiap nilai sepadan dengan dokumen pengguna: userinfo
<code class="language-javascript">{ "$lookup": { "localField": "user_id", "from": "user", "foreignField": "_id", "as": "userinfo" } }</code>Kami mempunyai hubungan satu sama lain
dan post.user_id
kerana jawatan hanya boleh mempunyai satu pengarang. Oleh itu, array user._id
kami akan sentiasa mengandungi hanya satu item. Kita boleh menggunakan pengendali userinfo
untuk memecahkannya ke dalam subdokumen: $unwind
<code class="language-json">"userinfo": [ { "name": "User One", ... } ]</code>output kini akan ditukar kepada format yang lebih praktikal, dengan pengendali lain yang tersedia untuk memohon:
<code class="language-javascript">{ "$unwind": "$userinfo" }</code>Akhirnya, kita boleh menggunakan peringkat
dalam saluran paip untuk mengembalikan teks, masa pos, nama pengguna dan negara: $project
<code class="language-sql">SELECT book.title, publisher.name FROM book LEFT JOIN book.publisher_id ON publisher.id;</code>
pertanyaan agregat akhir kami sepadan dengan catatan, macam -macam dalam urutan, had ke dua puluh item terkini, menghubungkan data pengguna, meratakan susunan pengguna dan mengembalikan hanya medan yang diperlukan. Perintah Lengkap:
<code class="language-json">{ "_id": ObjectID("45b83bda421238c76f5c1969"), "name": "User One", "email": "userone@email.com", "country": "UK", "dob": ISODate("1999-09-13T00:00:00.000Z") }</code>
Hasilnya adalah koleksi sehingga dua puluh dokumen. Contohnya:
<code class="language-json">{ "_id": ObjectID("17c9812acff9ac0bba018cc1"), "user_id": ObjectID("45b83bda421238c76f5c1969"), "date": ISODate("2016-09-05T03:05:00.123Z"), "text": "My life story so far", "rating": "important" }</code>hebat! Saya akhirnya boleh beralih ke NoSQL!
berguna dan berkuasa, tetapi juga contoh asas ini memerlukan pertanyaan agregasi yang kompleks. Ia tidak dapat menggantikan klausa gabungan yang lebih kuat dalam SQL. MongoDB juga tidak memberikan kekangan; $lookup
harus jarang diperlukan. Sekiranya anda memerlukannya dengan kerap, anda mungkin menggunakan kedai data yang salah ... $lookup
Jika anda mempunyai data hubungan, sila gunakan pangkalan data hubungan (SQL)!iaitu,
adalah tambahan yang popular kepada MongoDB 3.2. Ia mengatasi beberapa masalah yang lebih mengecewakan apabila menggunakan sedikit data relasi dalam pangkalan data NoSQL. $lookup
dan tahap $lookup
dalam pengagregatan. Kaedah ini membolehkan anda menggabungkan data dari pelbagai koleksi ke dalam satu set hasil. $graphLookup
Bagaimanakah tahap
$lookup
di MongoDB membolehkan anda menyambungkan dokumen dari koleksi lain (koleksi "disambungkan") dan tambahkan dokumen yang disambungkan ke dokumen input. Fasa
$lookup
Bolehkah saya melakukan carian rekursif menggunakan sambungan MongoDB? $lookup
$graphLookup
Bagaimana untuk mengoptimumkan prestasi apabila menggunakan sambungan MongoDB? $graphLookup
[ 🎜> peringkat
Ya, anda boleh menyambungkan pelbagai koleksi MongoDB dengan menghubungkan pelbagai $lookup
peringkat dalam saluran paip agregasi. Setiap peringkat $lookup
menambah dokumen yang disambungkan dari koleksi lain ke dokumen input.
Apabila menggunakan sambungan MongoDB, jika dokumen dalam koleksi input tidak sepadan dengan mana -mana dokumen dalam koleksi "Dari", fasa $lookup
menambah array kosong ke medan "As". Anda boleh mengendalikan nilai null atau hilang ini dengan menambahkan fasa $lookup
selepas fasa $match
untuk menyaring dokumen dengan medan kosong "sebagai".
Bermula dari MongoDB 3.6, peringkat $lookup
dan $graphLookup
boleh menerima set sharded untuk menjadi "dari" set. Walau bagaimanapun, disebabkan oleh overhead rangkaian tambahan, prestasi mungkin tidak sebaik koleksi tidak dicukur.
Anda boleh menyusun dokumen yang disambungkan di MongoDB dengan menambahkan fasa $lookup
selepas fasa $sort
dalam saluran paip pengagregatan. Peringkat $sort
menyusun dokumen dalam medan yang ditentukan dalam urutan menaik atau menurun.
find()
kaedah? Tidak, sambungan MongoDB tidak boleh digunakan dengan kaedah find()
. Tahap $lookup
dan $graphLookup
adalah sebahagian daripada rangka kerja agregasi yang menyediakan keupayaan pemprosesan data yang lebih maju daripada kaedah find()
.
Untuk debug atau selesaikan kegagalan sambungan MongoDB, anda boleh menggunakan kaedah explain()
untuk menganalisis pelan pelaksanaan saluran paip agregat. Kaedah explain()
menyediakan maklumat terperinci mengenai panggung, termasuk bilangan dokumen yang diproses, masa yang dibelanjakan, dan penggunaan indeks.
Atas ialah kandungan terperinci Menggunakan Join In MongoDB NoSQL Pangkalan Data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!