Bagaimana cara menautkan banyak koleksi di mongodb?

Cara Mengambil Data dari Berbagai Koleksi melalui Operasi Agregasi MongoDB— (Dijelaskan Dengan Contoh)

Beberapa hari yang lalu, saya sedang berbicara dengan beberapa teman dan kolega pengembang saya dan menurut saya kebanyakan dari kita salah memahami tahapan agregasi dan operator di MongoDB. Jadi saya berpikir untuk membagikan pembelajaran dan pengetahuan saya tentang hal ini karena saya sangat merasa bahwa untuk meningkatkan skala sistem dan meningkatkan kinerja aplikasi, pengoptimalan kueri basis data merupakan bagian yang tidak terpisahkan.

Pada artikel ini, kita akan belajar tentang beberapa teknik agregasi yang paling penting dan digunakan di MongoDB. Anda dapat menandai artikel ini dan ini bisa sangat berguna kapan pun Anda membutuhkan bantuan

Ok, cukup, mari kita mulai

Apa itu Agregasi di MongoDB?

Agregasi — seperti yang disarankan oleh arti harfiahnya, ini melibatkan penggabungan berbagai hal, demikian pula dalam agregasi MongoDb adalah teknik untuk meminta data dari beberapa koleksi dengan mengelompokkan atau menggabungkannya diikuti dengan melakukan berbagai operasi (dijelaskan nanti dalam dokumen ini) dan kemudian mengembalikan hasil yang dihitung

Mari kita ambil contoh kueri pencarian,

Collection.find(query, projection);
// query - query for filtering out the data
// projection - Specifies the fields to return in the documents that match the query filter

Sekarang periksa format kueri agregat,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
_

Jadi seperti yang Anda lihat, kueri agregat jauh lebih maju daripada kueri pencarian dan juga dapat melakukan operasi manipulasi data pada data yang difilter, tidak seperti kueri pencarian di mana seseorang hanya terbatas pada pengambilan data

Tahapan Pipa Agregasi

Dalam setiap kueri agregasi, pipeline dinyatakan muncul dalam bentuk larik, di mana semua operasi ditempatkan secara berurutan. Ini disebut Tahapan Pipa Agregasi, dalam artikel ini, kami akan merujuknya sebagai tahapan

Berbagai Opsi Kueri Agregasi

Kami akan membahas semua berbagai operator yang tersedia dalam kueri agregasi. Di bawah ini adalah diagram database sederhana tempat kami akan melakukan semua kueri,

Koleksi dan Struktur Data yang akan kita gunakan untuk semua contoh

$ cocok

Operasi ini untuk membaca data dari koleksi berdasarkan ekspresi yang cocok yang mirip dengan kueri find(). Satu-satunya perbedaan adalah di sini penyaringan terjadi melalui ekspresi kueri $expr ( {$expr. {$eq. ['_id', '123' ] } } ) daripada ekspresi mentah ( { _id. ‘123’ } ) seperti pada metode find

Jadi untuk mendapatkan catatan pengguna dengan id 123 dari koleksi Pengguna, di bawah ini adalah kueri agregasi,

User.aggregate([{ $match: {$expr: {$eq: [‘ID’, ‘123' ] } }]);

$eq adalah operator yang cocok di sini, yang cocok dengan ID. Demikian pula, kita dapat menggunakan $ne untuk memilih dokumen yang nilai kuncinya tidak sama dengan nilai yang ditentukan

$ lookup

Pencarian adalah tahap yang melakukan gabungan luar kiri dengan koleksi lain dan memfilter data dari dokumen gabungan

Jadi dalam kasus kami jika kami ingin mendapatkan semua pesanan dengan nama pengguna, maka kami dapat menggunakan kueri di bawah ini,

Orders.aggregate([{ 
$lookup: {
from: 'User',
localField: 'User_ID',
foreignField: 'ID',
as: 'Customer'
}}]);

Sekarang dalam kueri ini parameter pertama 'dari' menentukan koleksi yang akan digabungkan dengan yang sekarang, kemudian 'localField' menentukan kunci yang ada di koleksi saat ini yang akan dicocokkan dengan kunci asing di koleksi lain melalui . Di sini, User_ID dari Pesanan dan ID dari Pengguna dicocokkan dan digabungkan untuk mendapatkan data. Pada akhirnya 'as' digunakan sebagai alias untuk data

Satu hal yang perlu diperhatikan di sini adalah, di setiap catatan keluaran dari pencarian, data dari tabel yang digabungkan masuk ke dalam array sebagai elemen pertama, setiap baris dari data keluaran dari kueri di atas akan terlihat seperti,

{ ID: String, Quantity: Number, User_ID: String, Customer: Array, Item_ID: String, Ordered_On: Date }
_

Di sini, di array Pelanggan, elemen pertama adalah data yang telah kita gabungkan

saluran pipa

Untuk menggabungkan koleksi dengan kondisi khusus yang memerlukan ekspresi, kami menggunakan pipeline bersama dengan $lookup

Jadi jika kita ingin mendapatkan semua pengguna dengan pesanan mereka yang jumlahnya lebih dari 5,

User.aggregate([{ 
$lookup: {
from: 'Orders',
let: {ID: '$ID'},
pipeline: [{$match: {
$expr: {
$eq: [
'$User_ID', '$$ID'
],
$gt: [
'$quantity', 5
]
}}}]
as: 'OrdersData'
}}]);

Jadi dengan menggunakan pipeline di dalam $lookup kita dapat dengan mudah menggabungkan tabel dengan kondisi apa pun

$bersantai

Favorit pribadi saya, operator $unwind meratakan larik apa pun dan melampirkannya ke dokumen keluaran. Jadi kueri di bawah ini (sama dengan yang kami gunakan di $lookup ),

Orders.aggregate([{ 
$lookup: {
from: 'User',
localField: 'User_ID',
foreignField: 'ID',
as: 'Customer'
}},
{
$unwind: '$Customer'
}
]);
_

akan menghasilkan

{ ID: String, Quantity: Number, User_ID: String, Customer: Object, Item_ID: String, Ordered_On: Date }

Perbedaan mendasar di sini adalah $unwind mengonversi larik yang berisi satu elemen menjadi objek rata yang merupakan elemen itu sendiri, dengan nama yang sama

// without $unwind
output_data.Customer[0].Name
// With $unwind
output_data.Customer.Name
_

$addFields

Sekarang banyak yang akan berpikir bagaimana jika saya menginginkan Pelanggan saja. Beri nama tetapi di tingkat root dokumen sehingga kita dapat mengaksesnya seperti di bawah ini,

output_data.Customer_Name
_

Sayangnya, $unwind tidak dapat melakukan ini. /

Muncullah pahlawan super bernama, $addFields, dengan menggunakan tahap khusus ini kita dapat menetapkan data apa pun dari dalam objek/array ke tingkat akar dokumen

Jadi, untuk mendapatkan Nama Pelanggan seperti yang disebutkan di atas, kita dapat menulis sesuatu seperti -

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
_0

$proyek

Proyek pada dasarnya adalah tahap filter dalam kueri agregasi, ini memberi tahu bidang mana yang akan disimpan dalam dokumen akhir

Sebagai contoh, pada contoh sebelumnya kita telah melihat bagaimana kita bisa meratakan Nama_Pelanggan di luar objek Pelanggan dalam kumpulan data yang dihasilkan, namun, properti Pelanggan akan tetap ada

Karena kita sudah mendapatkan Customer_Name, objek Pelanggan tidak diperlukan lagi, jadi kita harus menghapusnya, dan kita hanya akan menyimpan Nama Pelanggan, Kuantitas yang Dipesan, dan ID_Item dalam output. Kita bisa melakukannya dengan menggunakan $project,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
_1

Sekarang kueri di atas akan memberi kita keluaran seperti,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
_2

Bergabung dengan Lebih dari 2 Koleksi menggunakan Agregasi MongoDB

Sekarang ada Item_ID di sana dalam data keluaran, yang tidak dapat dibaca dan jika itu adalah nama Item, maka memahami data itu akan jauh lebih mudah. Ayo lakukan itu,

Collection.aggregate(pipeline, options)
// pipeline -
A sequence of data aggregation operations or stages.
// options -
An optional configuration applicable for multiple operations in pipeline and it's used to optimize or setting rules for executing the query, it doesn't do any data processing
_3

Di bawah ini adalah lembar contekan Agregasi MongoDB yang bisa sangat berguna

Baiklah, kami telah mempelajari beberapa operasi dan tahapan terpenting untuk Agregasi MongoDB, jangan ragu untuk mengajukan pertanyaan apa pun di bagian komentar, saya akan dengan senang hati menjawabnya

Bisakah Anda memiliki banyak koleksi di MongoDB?

Ya, Anda dapat memiliki banyak koleksi dalam database di MongoDB . Koleksi dapat dianalogikan dengan tabel dalam database relasional.

Bagaimana cara mencari banyak koleksi di MongoDB?

Anda dapat meminta beberapa koleksi menggunakan agregasi $lookup . Saya menulis contoh di sini di forum. Selain itu, Sumber Data Hasil Kueri benar-benar dapat menggabungkan hasil dari beberapa kueri MongoDB. Tidak masalah basis data sumber mana yang Anda gunakan.

Bagaimana cara membuat banyak ke banyak hubungan di MongoDB?

Karena tidak ada perintah tunggal untuk mengimplementasikan hubungan banyak-ke-banyak dalam basis data relasional, ini lebih sulit daripada hubungan satu-ke-banyak. Hal yang sama berlaku saat menggunakan mongoDB untuk mengimplementasikannya. Nyatanya, Anda tidak dapat menggunakan perintah untuk membuat jenis hubungan apa pun di MongoDB .

Bagaimana cara saya bergabung dengan koleksi di MongoDB?

Bergabung dengan Koleksi . Tahap $lookup memungkinkan Anda menentukan koleksi mana yang ingin Anda gabungkan dengan koleksi saat ini, dan bidang mana yang harus cocok. perform a left outer join by using the $lookup stage. The $lookup stage lets you specify which collection you want to join with the current collection, and which fields that should match.