Rumah >Peranti teknologi >industri IT >Menggunakan Join In MongoDB NoSQL Pangkalan Data

Menggunakan Join In MongoDB NoSQL Pangkalan Data

William Shakespeare
William Shakespeareasal
2025-02-18 12:59:14469semak imbas

Using JOINs in MongoDB NoSQL Databases

mata teras

    MongoDB, pangkalan data NoSQL, memperkenalkan pengendali
  • baru dalam versi 3.2, yang boleh melakukan operasi seperti kiri-join pada dua atau lebih set, dengan itu mencapai data yang serupa dengan pangkalan data relasi. Walau bagaimanapun, pengendali ini terhad untuk digunakan dalam operasi agregat, yang lebih kompleks dan biasanya lebih perlahan daripada pertanyaan carian mudah. $lookup
  • operator MongoDB memerlukan empat parameter:
  • (masukkan medan carian dalam dokumen), $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
  • berguna dan boleh membantu menguruskan sedikit data relasi dalam pangkalan data NoSQL, ia bukan pengganti untuk klausa gabungan yang lebih kuat dalam SQL. Jika dokumen pengguna dipadamkan di MongoDB, dokumen pos yatim akan dikekalkan, menunjukkan kekurangan kekangan. Oleh itu, jika pengendali
  • sering digunakan, ia mungkin menunjukkan bahawa storan data yang salah digunakan, dan pangkalan data relasi (SQL) mungkin lebih sesuai. $lookup $lookup
Terima kasih kepada Julian Motz atas bantuan semakan rakan sebaya.

Using JOINs in MongoDB NoSQL Databases 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?

Ini tidak selalu berlaku ...

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 anda

tidak 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 ...

agregasi mongoDB

$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

rangkaian sosial kami kini memerlukan koleksi jawatan yang menyimpan sejumlah besar kemas kini yang berwawasan dari pengguna. Dokumen menyimpan teks, tarikh, penarafan dan rujukan kepada pengguna yang menulisnya dalam bidang

: 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

  • : Masukkan medan carian dalam dokumen localField
  • : koleksi yang akan disambungkan from
  • : bidang yang terdapat dalam koleksi foreignField from
  • : Nama medan output. as
Oleh itu, pengendali kami adalah:

<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>

Letakkan semuanya bersama -sama

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!

MongoDB

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

Idealnya, pengendali

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

Soalan Lazim Mengenai Menggunakan Join In MongoDB NOSQL Databases (FAQ)

Apakah perbezaan antara sambungan SQL dan sambungan MongoDB?

Dalam pangkalan data SQL, operasi sambungan menggabungkan baris dari dua atau lebih jadual berdasarkan lajur yang berkaitan di antara mereka. Walau bagaimanapun, MongoDB, sebagai pangkalan data NoSQL, tidak menyokong sambungan SQL tradisional. Sebaliknya, MongoDB menyediakan dua cara untuk melakukan operasi yang sama: tahap

dan tahap $lookup dalam pengagregatan. Kaedah ini membolehkan anda menggabungkan data dari pelbagai koleksi ke dalam satu set hasil. $graphLookup Bagaimanakah tahap

di MongoDB berfungsi?

Tahap $lookup di MongoDB membolehkan anda menyambungkan dokumen dari koleksi lain (koleksi "disambungkan") dan tambahkan dokumen yang disambungkan ke dokumen input. Fasa

menentukan koleksi "dari", "Localfield" dan "Foreignfield" untuk memadankan dokumen, dan bidang "As" untuk mengeluarkan dokumen. Ia sama dengan gabungan luar kiri di SQL, mengembalikan semua dokumen dari koleksi input dan dokumen yang sepadan dari koleksi "Dari".

$lookup Bolehkah saya melakukan carian rekursif menggunakan sambungan MongoDB? $lookup

Ya, MongoDB menyediakan fasa

untuk carian rekursif. Peringkat

melakukan carian rekursif pada set yang ditentukan dan boleh memilih untuk mengehadkan kedalaman dan keluasan carian. Ia berguna untuk menanyakan data hierarki atau graf di mana bilangan tahap tidak diketahui atau mungkin berubah.

$graphLookup Bagaimana untuk mengoptimumkan prestasi apabila menggunakan sambungan MongoDB? $graphLookup [ 🎜> peringkat

dan

peringkat untuk menapis dan menukar dokumen.

Bolehkah saya menyambungkan pelbagai koleksi di MongoDB?

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.

Bagaimana menangani nilai null atau hilang semasa menggunakan sambungan MongoDB?

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".

Bolehkah saya menggunakan sambungan mongoDB dengan koleksi sharded?

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.

bagaimana menyusun dokumen yang disambungkan di MongoDB?

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.

Bolehkah saya menggunakan sambungan MongoDB dengan 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().

Bagaimana untuk menyahpepijat atau menyelesaikan kegagalan sambungan MongoDB?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn