Jadual Kandungan
Ini tidak selalu berlaku ...
agregasi mongoDB
Letakkan semuanya bersama -sama
untuk carian rekursif. Peringkat
peringkat untuk menapis dan menukar dokumen.
Bolehkah saya menyambungkan pelbagai koleksi di MongoDB?
Bagaimana menangani nilai null atau hilang semasa menggunakan sambungan MongoDB?
Bolehkah saya menggunakan sambungan mongoDB dengan koleksi sharded?
bagaimana menyusun dokumen yang disambungkan di MongoDB?
Bolehkah saya menggunakan sambungan MongoDB dengan find() kaedah?
Bagaimana untuk menyahpepijat atau menyelesaikan kegagalan sambungan MongoDB?
Rumah Peranti teknologi industri IT Menggunakan Join In MongoDB NoSQL Pangkalan Data

Menggunakan Join In MongoDB NoSQL Pangkalan Data

Feb 18, 2025 pm 12:59 PM

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.

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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:

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
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

{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}
Salin selepas log masuk
Salin selepas log masuk
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

{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}
Salin selepas log masuk
Salin selepas log masuk
kita kini perlu menyusun item yang sepadan dengan urutan terbalik dengan menggunakan pengendali

: $sort

{ "$match": { "rating": "important" } }
Salin selepas log masuk
Oleh kerana kita hanya memerlukan dua puluh jawatan, kita boleh menggunakan peringkat

supaya MongoDB hanya perlu memproses data yang kita mahu: $limit

{ "$sort": { "date": -1 } }
Salin selepas log masuk
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:

{ "$limit": 20 }
Salin selepas log masuk
Ini akan mewujudkan medan baru dalam output kami yang dipanggil

. Ia mengandungi array di mana setiap nilai sepadan dengan dokumen pengguna: userinfo

{ "$lookup": {
  "localField": "user_id",
  "from": "user",
  "foreignField": "_id",
  "as": "userinfo"
} }
Salin selepas log masuk
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

"userinfo": [
  { "name": "User One", ... }
]
Salin selepas log masuk
output kini akan ditukar kepada format yang lebih praktikal, dengan pengendali lain yang tersedia untuk memohon:

{ "$unwind": "$userinfo" }
Salin selepas log masuk
Akhirnya, kita boleh menggunakan peringkat

dalam saluran paip untuk mengembalikan teks, masa pos, nama pengguna dan negara: $project

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

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:

{
  "_id": ObjectID("45b83bda421238c76f5c1969"),
  "name": "User One",
  "email": "userone@email.com",
  "country": "UK",
  "dob": ISODate("1999-09-13T00:00:00.000Z")
}
Salin selepas log masuk
Salin selepas log masuk

Hasilnya adalah koleksi sehingga dua puluh dokumen. Contohnya:

{
  "_id": ObjectID("17c9812acff9ac0bba018cc1"),
  "user_id": ObjectID("45b83bda421238c76f5c1969"),
  "date": ISODate("2016-09-05T03:05:00.123Z"),
  "text": "My life story so far",
  "rating": "important"
}
Salin selepas log masuk
Salin selepas log masuk
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 Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1653
14
Tutorial PHP
1251
29
Tutorial C#
1224
24
CNCF Arm64 Pilot: Impak dan Wawasan CNCF Arm64 Pilot: Impak dan Wawasan Apr 15, 2025 am 08:27 AM

Program perintis ini, kerjasama antara CNCF (Yayasan Pengkomputeran Native Cloud), pengkomputeran ampere, equinix metal, dan digerakkan, menyelaraskan ARM64 CI/CD untuk projek GitHub CNCF. Inisiatif ini menangani kebimbangan keselamatan dan prestasi lim

Paip pemprosesan imej tanpa pelayan dengan AWS ECS dan Lambda Paip pemprosesan imej tanpa pelayan dengan AWS ECS dan Lambda Apr 18, 2025 am 08:28 AM

Tutorial ini membimbing anda melalui membina saluran paip pemprosesan imej tanpa pelayan menggunakan perkhidmatan AWS. Kami akan membuat frontend next.js yang digunakan pada kluster ECS Fargate, berinteraksi dengan Gateway API, Fungsi Lambda, Bucket S3, dan DynamoDB. Th

Surat berita pemaju 21 teratas untuk melanggan pada tahun 2025 Surat berita pemaju 21 teratas untuk melanggan pada tahun 2025 Apr 24, 2025 am 08:28 AM

Tinggal maklumat mengenai trend teknologi terkini dengan surat berita pemaju teratas ini! Senarai ini menawarkan sesuatu untuk semua orang, dari peminat AI ke pemaju backend dan frontend yang berpengalaman. Pilih kegemaran anda dan menjimatkan masa mencari rel

See all articles