Rumah >pangkalan data >MongoDB >Bagaimanakah saya menggunakan rangka kerja agregasi di mongoDB untuk transformasi data yang kompleks?
Artikel ini menerangkan rangka pengagregatan MongoDB, alat berasaskan saluran paip untuk transformasi data yang kompleks. Butirannya menggunakan peringkat seperti $ kumpulan, $ sort, $ padanan, dan $ mencari tugas seperti mengira jumlah, penapisan, menyertai koleksi, dan
Rangka kerja agregasi MongoDB adalah alat yang berkuasa untuk melakukan transformasi data yang kompleks secara langsung dalam pangkalan data. Ia menggunakan pendekatan berasaskan saluran paip, di mana data melalui satu siri peringkat, masing-masing melakukan operasi tertentu. Tahap -tahap ini boleh termasuk penapisan, pengumpulan, penyortiran, memproyeksikan, dan banyak lagi. Mari kita gambarkan dengan contoh. Bayangkan anda mempunyai koleksi yang dipanggil sales
dengan dokumen seperti ini:
<code class="json">{ "_id" : ObjectId("5f9f16c75474444444444444"), "item" : "ABC", "price" : 10, "quantity" : 2, "date" : ISODate("2024-01-15T00:00:00Z") } { "_id" : ObjectId("5f9f16c75474444444444445"), "item" : "XYZ", "price" : 20, "quantity" : 1, "date" : ISODate("2024-01-15T00:00:00Z") } { "_id" : ObjectId("5f9f16c75474444444444446"), "item" : "ABC", "price" : 10, "quantity" : 3, "date" : ISODate("2024-01-16T00:00:00Z") }</code>
Untuk mengira jumlah pendapatan bagi setiap item, anda akan menggunakan saluran paip pengagregatan berikut:
<code class="javascript">db.sales.aggregate([ { $group: { _id: "$item", totalRevenue: { $sum: { $multiply: ["$price", "$quantity"] } } } }, { $sort: { totalRevenue: -1 } } ])</code>
Paip ini pertama kumpulan dokumen oleh medan item
menggunakan $group
. Kemudian, bagi setiap kumpulan, ia mengira totalRevenue
menggunakan $sum
dan $multiply
untuk membiak harga dan kuantiti. Akhirnya, ia menyusun hasil dalam urutan menurun totalRevenue
menggunakan $sort
. Ini menunjukkan bagaimana pelbagai peringkat boleh dirantai bersama untuk transformasi yang kompleks. Tahap biasa lain termasuk $match
(penapisan), $project
(memilih dan menamakan semula medan), $unwind
(menyusun semula susunan), dan $lookup
(menyertai dengan koleksi lain - dibincangkan kemudian).
Di luar pertanyaan mudah seperti mencari dokumen yang sepadan dengan kriteria tertentu, rangka kerja agregasi cemerlang dalam senario yang memerlukan manipulasi dan analisis data. Berikut adalah beberapa kes penggunaan biasa:
Mengoptimumkan saluran paip agregasi untuk dataset besar adalah penting untuk prestasi. Berikut adalah beberapa strategi utama:
$match
, $sort
, $group
, dan $lookup
peringkat. Indeks dengan ketara mempercepat pengambilan data.$match
awal di saluran paip untuk menyaring dokumen yang tidak diingini secepat mungkin. Ini mengurangkan jumlah data yang diproses oleh peringkat seterusnya.$sum
biasanya lebih cepat daripada $reduce
untuk menjumlahkan nilai.$project
untuk mengurangkan jumlah data yang diproses.$lookup
Joins: Apabila menyertai koleksi, pastikan koleksi bergabung mempunyai indeks yang sesuai di medan Join. Pertimbangkan menggunakan $lookup
dengan let
dan pipeline
untuk keadaan gabungan yang kompleks.explain()
: Gunakan db.collection.aggregate(...).explain()
kaedah untuk menganalisis pelan pelaksanaan dan mengenal pasti kemungkinan kesesakan. Ya, rangka kerja agregasi MongoDB menyokong bergabung dan mencari dari koleksi lain menggunakan peringkat $lookup
. $lookup
melakukan gabungan luar kiri, membawa data dari koleksi lain berdasarkan keadaan gabungan yang ditentukan.
Sebagai contoh, pertimbangkan dua koleksi: customers
dan orders
.
<code class="json">// customers collection { "_id" : 1, "name" : "John Doe" } { "_id" : 2, "name" : "Jane Smith" } // orders collection { "_id" : 101, "customer_id" : 1, "amount" : 100 } { "_id" : 102, "customer_id" : 1, "amount" : 200 } { "_id" : 103, "customer_id" : 2, "amount" : 50 }</code>
Untuk mendapatkan maklumat pelanggan bersama dengan pesanan mereka, anda akan menggunakan saluran paip pengagregatan berikut:
<code class="javascript">db.customers.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "customer_id", as: "orders" } } ])</code>
Pipa ini menyertai customers
dan orders
koleksi berdasarkan bidang _id
dalam bidang customers
dan customer_id
dalam orders
. Hasilnya akan merangkumi maklumat pelanggan dan pelbagai pesanan yang berkaitan dalam medan orders
. Ingatlah untuk membuat indeks di medan _id
dalam bidang customers
dan customer_id
dalam orders
untuk prestasi optimum. Keadaan gabungan yang lebih kompleks boleh dicapai dengan menggunakan pilihan let
dan pipeline
dalam peringkat $lookup
.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan rangka kerja agregasi di mongoDB untuk transformasi data yang kompleks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!