MongoDB - Agregasi
Operasi agregasi memproses catatan data dan mengembalikan hasil yang dihitung. Operasi agregasi mengelompokkan nilai dari beberapa dokumen secara bersamaan, dan dapat melakukan berbagai operasi pada data yang dikelompokkan untuk mengembalikan satu hasil. Dalam jumlah SQL (*) dan dengan grup oleh adalah setara dengan agregasi MongoDB.
Metode aggregate ()
Untuk agregasi di MongoDB, Anda harus menggunakan aggregate() metode.
Sintaksis
Sintaks dasar aggregate() metode adalah sebagai berikut -
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
Contoh
Dalam koleksi Anda memiliki data berikut -
{
_id: ObjectId(7df78ad8902c)
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'tutorials point',
url: 'http://www.tutorialspoint.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
},
Nah dari koleksi di atas, jika Anda ingin menampilkan daftar yang menyatakan berapa banyak tutorial yang ditulis oleh setiap pengguna, maka Anda akan menggunakan yang berikut ini aggregate() metode -
> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>
Kueri setara Sql untuk kasus penggunaan di atas akan menjadi select by_user, count(*) from mycol group by by_user.
Dalam contoh di atas, kami telah mengelompokkan dokumen berdasarkan bidang by_userdan pada setiap kemunculan oleh pengguna nilai jumlah sebelumnya bertambah. Berikut adalah daftar ekspresi agregasi yang tersedia.
Ekspresi | Deskripsi | Contoh |
---|---|---|
$ jumlah | Meringkas nilai yang ditentukan dari semua dokumen dalam koleksi. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ sum: "$ likes"}}}]) |
$ rata-rata | Menghitung rata-rata semua nilai yang diberikan dari semua dokumen dalam koleksi. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}]) |
$ min | Mendapat nilai minimum yang sesuai dari semua dokumen dalam koleksi. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}]) |
$ maks | Mendapat nilai maksimum yang sesuai dari semua dokumen dalam koleksi. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ max: "$ likes"}}}]) |
$ push | Menyisipkan nilai ke array di dokumen yang dihasilkan. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ push: "$ url"}}}]) |
$ addToSet | Menyisipkan nilai ke larik di dokumen yang dihasilkan tetapi tidak membuat duplikat. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}]) |
$ pertama | Mendapat dokumen pertama dari dokumen sumber sesuai dengan pengelompokannya. Biasanya ini hanya masuk akal bersama dengan beberapa tahap "$ sort" yang diterapkan sebelumnya. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}]) |
$ terakhir | Mendapat dokumen terakhir dari dokumen sumber sesuai dengan pengelompokannya. Biasanya ini hanya masuk akal bersama dengan beberapa tahap "$ sort" yang diterapkan sebelumnya. | db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}]) |
Konsep Pipa
Dalam perintah UNIX, shell pipeline berarti kemungkinan untuk menjalankan operasi pada beberapa masukan dan menggunakan keluaran tersebut sebagai masukan untuk perintah berikutnya dan seterusnya. MongoDB juga mendukung konsep yang sama dalam kerangka agregasi. Ada satu set tahapan yang mungkin dan masing-masing tahapan tersebut diambil sebagai sekumpulan dokumen sebagai input dan menghasilkan sekumpulan dokumen yang dihasilkan (atau dokumen JSON yang dihasilkan akhir di akhir pipeline). Ini kemudian dapat digunakan untuk tahap berikutnya dan seterusnya.
Berikut adalah tahapan yang mungkin dalam kerangka agregasi -
$project - Digunakan untuk memilih beberapa bidang tertentu dari koleksi.
$match - Ini adalah operasi pemfilteran sehingga dapat mengurangi jumlah dokumen yang diberikan sebagai masukan ke tahap berikutnya.
$group - Ini melakukan agregasi yang sebenarnya seperti yang dibahas di atas.
$sort - Mengurutkan dokumen.
$skip - Dengan ini, dimungkinkan untuk melompat ke depan dalam daftar dokumen untuk sejumlah dokumen tertentu.
$limit - Ini membatasi jumlah dokumen untuk dilihat, dengan jumlah yang diberikan mulai dari posisi saat ini.
$unwind- Ini digunakan untuk melepas dokumen yang menggunakan array. Saat menggunakan larik, datanya adalah jenis pra-bergabung dan operasi ini akan dibatalkan dengan ini untuk memiliki dokumen individual lagi. Maka dengan tahap ini kami akan menambah jumlah dokumen untuk tahap selanjutnya.