Mongodb agregat satu ke satu

Saat Anda mulai bekerja dengan MongoDB, biasanya Anda akan menggunakan perintah

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
4 untuk berbagai kueri. Namun, segera setelah kueri Anda semakin maju, Anda perlu mengetahui lebih banyak tentang agregasi MongoDB

Pada artikel ini, saya akan menjelaskan prinsip utama membangun kueri agregat di MongoDB dan cara memanfaatkan indeks untuk mempercepatnya

Selanjutnya, saya akan memperkenalkan tahapan paling penting dari pipa agregasi dengan contoh singkat menggunakan masing-masing, dan bagaimana menerapkannya ke pipa

Agregasi adalah cara memproses sejumlah besar dokumen dalam koleksi dengan cara melewatkannya melalui tahapan yang berbeda. Tahapan membentuk apa yang dikenal sebagai pipa. Tahapan dalam pipeline dapat memfilter, mengurutkan, mengelompokkan, membentuk ulang, dan memodifikasi dokumen yang melewati pipeline

Salah satu kasus penggunaan Agregasi yang paling umum adalah menghitung nilai agregat untuk grup dokumen. Ini mirip dengan agregasi dasar yang tersedia di SQL dengan klausa GROUP BY dan fungsi COUNT, SUM dan AVG. Agregasi MongoDB melangkah lebih jauh dan juga dapat melakukan gabungan seperti relasional, membentuk ulang dokumen, membuat koleksi baru dan memperbarui yang ada, dan seterusnya.  

Meskipun ada metode lain untuk mendapatkan data agregat di MongoDB, kerangka kerja agregasi adalah pendekatan yang direkomendasikan untuk sebagian besar pekerjaan

Ada yang disebut metode tujuan tunggal seperti

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
5, 
use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
6, dan
use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
7 yang ditambahkan ke kueri
use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
4 sehingga cepat digunakan tetapi cakupannya terbatas

Kerangka pengurangan peta pada MongoDB adalah pendahulu kerangka agregasi dan jauh lebih kompleks untuk digunakan. MongoDB sudah tidak digunakan lagi

Berikut adalah diagram untuk mengilustrasikan pipa agregasi MongoDB yang khas

Mongodb agregat satu ke satu
  • Tahap
    use 3tdb
    db.universities.insert([
    {
      country : 'Spain',
      city : 'Salamanca',
      name : 'USAL',
      location : {
        type : 'Point',
        coordinates : [ -5.6722512,17, 40.9607792 ]
      },
      students : [
        { year : 2014, number : 24774 },
        { year : 2015, number : 23166 },
        { year : 2016, number : 21913 },
        { year : 2017, number : 21715 }
      ]
    },
    {
      country : 'Spain',
      city : 'Salamanca',
      name : 'UPSA',
      location : {
        type : 'Point',
        coordinates : [ -5.6691191,17, 40.9631732 ]
      },
      students : [
        { year : 2014, number : 4788 },
        { year : 2015, number : 4821 },
        { year : 2016, number : 6550 },
        { year : 2017, number : 6125 }
      ]
    }
    ])
    _9 – menyaring dokumen-dokumen yang perlu kita kerjakan, yang sesuai dengan kebutuhan kita
  • {
      university : 'USAL',
      name : 'Computer Science',
      level : 'Excellent'
    }
    {
      university : 'USAL',
      name : 'Electronics',
      level : 'Intermediate'
    }
    {
      university : 'USAL',
      name : 'Communication',
      level : 'Excellent'
    }
    _0 tahap – melakukan pekerjaan agregasi
  • {
      university : 'USAL',
      name : 'Computer Science',
      level : 'Excellent'
    }
    {
      university : 'USAL',
      name : 'Electronics',
      level : 'Intermediate'
    }
    {
      university : 'USAL',
      name : 'Communication',
      level : 'Excellent'
    }
    1  tahap – mengurutkan dokumen yang dihasilkan sesuai kebutuhan (naik atau turun)

Input dari pipeline dapat berupa satu kumpulan, di mana yang lain dapat digabungkan nanti di pipeline

Pipeline kemudian melakukan transformasi berturut-turut pada data hingga tujuan kami tercapai

Dengan cara ini, kami dapat memecah kueri kompleks menjadi tahapan yang lebih mudah, di mana setiap tahapan kami menyelesaikan operasi berbeda pada data. Jadi, di akhir jalur kueri, kami akan mencapai semua yang kami inginkan

Pendekatan ini memungkinkan kita untuk memeriksa apakah kueri kita berfungsi dengan baik di setiap tahap dengan memeriksa input dan outputnya. Keluaran dari setiap tahap akan menjadi masukan bagi tahap berikutnya

Alat seperti Studio 3T memungkinkan Anda membuat kueri agregasi

Unduh Studio 3T Gratis untuk Mac, Windows, atau Linux

Tidak ada batasan jumlah tahapan yang digunakan dalam kueri, atau cara kami menggabungkannya

Untuk mencapai kinerja kueri yang optimal, ada sejumlah praktik terbaik yang perlu diperhatikan. Kami akan membahasnya nanti di artikel

Ini adalah contoh cara membuat kueri agregasi

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_2,

  • di mana collectionName – adalah nama koleksi,
  • pipeline – adalah larik yang berisi tahapan agregasi,
  • opsi – parameter opsional untuk agregasi

Ini adalah contoh sintaks pipa agregasi

pipeline = [
        { $match : { … } },
        { $group : { … } },
        { $sort : { … } }
       ]
_

Agregasi bekerja di memori. Setiap tahap dapat menggunakan hingga 100 MB RAM. Anda akan mendapatkan error dari database jika melebihi batas ini

Jika itu menjadi masalah yang tidak dapat dihindari, Anda dapat memilih ke halaman ke disk, dengan satu-satunya kelemahan adalah Anda akan menunggu lebih lama karena lebih lambat bekerja di disk daripada di memori. Untuk memilih metode halaman ke disk, Anda hanya perlu mengatur opsi

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
3 menjadi benar seperti ini

db.collectionName.aggregate(pipeline, { allowDiskUse : true })

Perhatikan bahwa opsi ini tidak selalu tersedia untuk layanan bersama. Misalnya cluster Atlas M0, M2 dan M5 menonaktifkan opsi ini

Dokumen yang dikembalikan oleh kueri agregasi, baik sebagai kursor atau disimpan melalui

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
4 di koleksi lain, dibatasi hingga 16 MB. Artinya, mereka tidak boleh lebih besar dari ukuran maksimum dokumen MongoDB

Jika Anda cenderung melebihi batas ini, maka Anda harus menentukan bahwa keluaran kueri agregasi akan berupa kursor dan bukan sebagai dokumen

Saya akan menunjukkan contoh agregat MongoDB untuk tahapan pipeline yang paling penting

Untuk mengilustrasikan contoh, saya akan menggunakan dua koleksi. Yang pertama disebut

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_5 dan terdiri dari dokumen-dokumen ini (datanya tidak nyata)

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}

Jika Anda ingin menguji contoh-contoh ini pada instalasi Anda sendiri, Anda dapat memasukkannya dengan perintah massal di bawah, atau

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])

Koleksi kedua dan terakhir disebut

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_6 dan terlihat seperti ini

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_

Sekali lagi, Anda dapat menyisipkannya dengan cara yang sama, menggunakan kode berikut atau dengan mengimpornya sebagai file JSON

db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])

tempat Anda akan menemukan file JSON yang tersedia untuk diunduh

Tahap

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
9 memungkinkan kita untuk memilih hanya dokumen-dokumen dari koleksi yang ingin kita kerjakan. Ini dilakukan dengan memfilter yang tidak mengikuti persyaratan kami

Dalam contoh berikut, kami hanya ingin bekerja dengan dokumen yang menentukan bahwa 

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
8 adalah nilai bidang
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
9, dan
db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
0 adalah nilai bidang
db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
1

Untuk mendapatkan keluaran yang dapat dibaca, saya akan menambahkan

db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
2 di akhir semua perintah

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()

Keluarannya adalah…

{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}

Jarang Anda perlu mengambil semua bidang dalam dokumen Anda. Merupakan praktik yang baik untuk mengembalikan hanya bidang yang Anda perlukan untuk menghindari pemrosesan lebih banyak data daripada yang diperlukan

Tahap

db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
_3 digunakan untuk melakukan ini dan untuk menambahkan bidang kalkulasi yang Anda perlukan

Dalam contoh ini, kita hanya memerlukan field

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
9,
db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
1 dan
db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
6

Dalam kode berikut, harap perhatikan itu

  • Kita harus secara eksplisit menulis
    db.courses.insert([
    {
      university : 'USAL',
      name : 'Computer Science',
      level : 'Excellent'
    },
    {
      university : 'USAL',
      name : 'Electronics',
      level : 'Intermediate'
    },
    {
      university : 'USAL',
      name : 'Communication',
      level : 'Excellent'
    }
    ])
    _7 ketika bidang ini tidak diperlukan
  • Selain bidang
    db.courses.insert([
    {
      university : 'USAL',
      name : 'Computer Science',
      level : 'Excellent'
    },
    {
      university : 'USAL',
      name : 'Electronics',
      level : 'Intermediate'
    },
    {
      university : 'USAL',
      name : 'Communication',
      level : 'Excellent'
    }
    ])
    _8, cukup untuk menentukan hanya bidang yang perlu kami peroleh sebagai hasil kueri

Tahap ini …

db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()

akan memberikan hasil…

{ "country" : "Spain", "city" : "Salamanca", "name" : "USAL" }
{ "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }

Ini contoh lain dari proyek $ MongoDB

Dengan tahap

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_0, kita dapat melakukan semua kueri agregasi atau ringkasan yang kita perlukan, seperti menemukan jumlah, total, rata-rata, atau maksimum

Dalam contoh ini, kami ingin mengetahui jumlah dokumen per universitas dalam koleksi '

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
0' kami

Permintaan …

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_0

akan membuahkan hasil ini…

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_1

Tahap $group mendukung ekspresi tertentu (operator) yang memungkinkan pengguna untuk melakukan operasi aritmatika, larik, boolean, dan lainnya sebagai bagian dari pipa agregasi

OperatorMeaning$countMenghitung jumlah dokumen dalam grup tertentu. $maxMenampilkan nilai maksimum bidang dokumen dalam koleksi. $minMenampilkan nilai minimum bidang dokumen dalam koleksi. $avgMenampilkan nilai rata-rata bidang dokumen dalam koleksi. $sumMenjumlahkan nilai yang ditentukan dari semua dokumen dalam koleksi. $pushMenambahkan nilai ekstra ke dalam larik dokumen yang dihasilkan

Lihat untuk melihat operator MongoDB lainnya dan pelajari lebih lanjut tentang topik ini

Ini adalah jenis tahapan yang tidak biasa karena memungkinkan Anda untuk membawa hasil agregasi Anda ke koleksi baru, atau ke koleksi yang sudah ada setelah melepaskannya, atau bahkan menambahkannya ke dokumen yang sudah ada (baru di 4. 1. 2 versi)

Tahap

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
4 harus menjadi tahap terakhir dalam alur

Untuk pertama kalinya, kami menggunakan agregasi dengan lebih dari satu tahap. Kami sekarang memiliki dua,

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_0 dan
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
4

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_2

Sekarang, kami memeriksa konten koleksi baru '

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
4'

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_3

Inilah cara kami menggunakan tahap $out dalam contoh tiga bagian ini

Sekarang kami telah menghasilkan agregasi multi-tahap, kami dapat terus membangun saluran pipa

Tahap

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
_5 di MongoDB umumnya ditemukan dalam pipa karena merupakan sarana untuk mencapai tujuan

Anda tidak dapat bekerja secara langsung pada elemen array di dalam dokumen dengan tahapan seperti

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
0. Tahap
db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
_5 memungkinkan kita bekerja dengan nilai bidang dalam array

Jika terdapat bidang larik di dalam dokumen masukan, terkadang Anda perlu menampilkan dokumen beberapa kali, satu kali untuk setiap elemen larik tersebut

Setiap salinan dokumen memiliki bidang larik yang diganti dengan elemen yang berurutan

Dalam contoh berikutnya, saya akan menerapkan tahapan hanya pada dokumen yang bidangnya

db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
6 berisi nilai
db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
9

Ini dokumennya

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_4

Sekarang, kami menerapkan tahap

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
_5, di atas larik siswa, dan memeriksa apakah kami mendapatkan dokumen per setiap elemen larik

Dokumen pertama terdiri dari bidang di elemen pertama array dan bidang umum lainnya

Dokumen kedua terdiri dari bidang di elemen kedua dari array dan bidang umum lainnya, dan seterusnya

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_5

Anda memerlukan tahapan

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
_1 untuk mengurutkan hasil menurut nilai bidang tertentu

Misalnya, mari kita urutkan dokumen yang diperoleh sebagai hasil dari tahap

db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
5 berdasarkan jumlah siswa dalam urutan menurun

Untuk mendapatkan hasil yang lebih sedikit, saya hanya akan memproyeksikan tahun dan jumlah siswa

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_6

Ini memberikan hasil…

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_7

Tahapan 

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1 dapat digunakan dengan tahapan lain untuk mengurangi data dalam koleksi MongoDB sesuai kebutuhan Anda

Bagaimana jika Anda hanya tertarik pada dua hasil pertama kueri Anda?

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_8

Perhatikan bahwa saat Anda perlu membatasi jumlah dokumen yang diurutkan, Anda harus menggunakan tahap

{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}
4 tepat setelah
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1

Sekarang kami memiliki pipa penuh

Kami dapat menempelkan seluruh kueri agregat MongoDB ini dan semua tahapannya langsung ke

Itu disisipkan dengan menyalinnya dan mengklik tombol tempel kode seperti yang ditunjukkan

Mongodb agregat satu ke satu

Baca selengkapnya tentang Editor Agregasi, pembuat kueri agregasi MongoDB tahap demi tahap dari Studio 3T

Hanya bagian yang ditunjukkan di bawah ini yang disalin dan ditempel

db.collectionName.aggregate(pipeline, { allowDiskUse : true })
_9

Di tangkapan layar berikutnya, kita bisa melihat saluran lengkap di Studio 3T dan hasilnya

Mongodb agregat satu ke satu

Menghapus tahapan di Studio 3T adalah masalah sederhana menggunakan tombol yang ditunjukkan pada tangkapan layar berikutnya

Mongodb agregat satu ke satu

Editor Agregasi Studio 3T mendukung operator dan tahapan agregasi MongoDB ini

Ada kemungkinan bahwa Anda perlu membuat beberapa perubahan pada output Anda di bidang baru. Pada contoh berikutnya, kami ingin menambahkan tahun berdirinya universitas

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_0

Ini memberikan hasil…

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_1

Tahap

{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}
_6 menyediakan cara mudah untuk memeriksa jumlah dokumen yang diperoleh dalam output dari tahap pipa sebelumnya

Mari kita lihat aksinya

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_2

Ini memberikan total tahun-tahun yang kita ketahui jumlah mahasiswa di Universitas

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_3

Karena MongoDB berbasis dokumen, kami dapat membentuk dokumen sesuai kebutuhan. Namun, seringkali ada persyaratan untuk menggunakan informasi dari lebih dari satu koleksi

Menggunakan

{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}
_7, berikut adalah kueri agregat yang menggabungkan bidang dari dua kumpulan

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_4

Perlu ________26______7 contoh lain?

Jika Anda ingin kueri ini berjalan cepat, Anda harus mengindeks bidang

db.courses.insert([
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
},
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
},
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
])
6 di koleksi
db.universities.aggregate([
  { $match : { country : 'Spain', city : 'Salamanca' } }
]).pretty()
0 dan bidang
db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
1 di koleksi
db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
2

Dengan kata lain, jangan lupa mengindeks bidang yang terlibat dalam

{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}
7

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_5

Inilah cara tercepat untuk

Tahapan ini merupakan jalan pintas untuk mengelompokkan, menghitung, dan kemudian mengurutkan dalam urutan menurun jumlah nilai yang berbeda dalam suatu bidang

Misalkan Anda ingin mengetahui jumlah kursus per level, diurutkan dalam urutan menurun. Berikut ini adalah kueri yang perlu Anda bangun

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_6

Ini adalah output

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_7

Terkadang saat membuat laporan tentang data, Anda menemukan bahwa Anda perlu melakukan pemrosesan pendahuluan yang sama untuk sejumlah laporan, dan Anda harus membuat dan memelihara kumpulan perantara

Anda dapat, misalnya, melakukan ringkasan perdagangan mingguan yang digunakan oleh semua laporan berikutnya. Anda mungkin berharap bisa menjalankan lebih dari satu pipeline secara bersamaan melalui output dari satu pipeline agregasi

Kami sekarang dapat melakukannya dalam satu pipa berkat tahap

db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
4

Lihatlah contoh ini

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_8

Apa yang telah kami lakukan adalah membuat dua laporan dari database program universitas kami. Menghitung Tingkat dan Tahun Dengan Siswa Lebih Sedikit

Mereka berdua menggunakan keluaran dari dua tahap pertama,

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
9 dan
{
"_id" : ObjectId("5b7d9d9efbc9884f689cdba9"),
"country" : "Spain","city" : "Salamanca",
"name" : "USAL",
"location" : {
      "type" : "Point",
      "coordinates" : [
            -5.6722512,
             17,
             40.9607792
       ]
},
"students" : [
		{
			"year" : 2014,
			"number" : 24774
		},
		{
			"year" : 2015,
			"number" : 23166
		},
		{
			"year" : 2016,
			"number" : 21913
		},
		{
			"year" : 2017,
			"number" : 21715
		}
	]
}
{
	"_id" : ObjectId("5b7d9d9efbc9884f689cdbaa"),
	"country" : "Spain",
	"city" : "Salamanca",
	"name" : "UPSA",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-5.6691191,
			17,
			40.9631732
		]
	},
	"students" : [
		{
			"year" : 2014,
			"number" : 4788
		},
		{
			"year" : 2015,
			"number" : 4821
		},
		{
			"year" : 2016,
			"number" : 6550
		},
		{
			"year" : 2017,
			"number" : 6125
		}
	]
}
7

Dengan koleksi yang besar, ini dapat menghemat banyak waktu pemrosesan dengan menghindari pengulangan, dan kita tidak perlu lagi menulis koleksi perantara sementara

{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
}
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
_9

Baca selengkapnya tentang kasus penggunaan tahap $facet lainnya dalam agregasi MongoDB

Sekarang, coba selesaikan sendiri latihan berikutnya

Bagaimana kita mendapatkan jumlah siswa yang pernah menjadi milik masing-masing universitas?

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
0

Hasil

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
_1

Ya, saya telah menggabungkan dua tahap. Namun, bagaimana cara membuat kueri yang mengurutkan keluaran berdasarkan bidang

db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
7 dalam urutan menurun?

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
_2

Benar, kita perlu menerapkan tahap

db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
_8 pada keluaran
db.universities.aggregate([
  { $project : { _id : 0, country : 1, city : 1, name : 1 } }
]).pretty()
9

Saya sebutkan sebelumnya bahwa sangat mudah, dan memang penting, untuk memeriksa apakah tahapan kueri kita berjalan seperti yang kita perlukan.

Dengan Studio 3T, Anda memiliki dua panel khusus untuk

Pipa agregasi secara otomatis membentuk ulang kueri dengan tujuan meningkatkan kinerjanya

Jika Anda memiliki tahap

{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1 dan
use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
9, selalu lebih baik menggunakan
use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
9 sebelum
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1 untuk meminimalkan jumlah dokumen yang harus ditangani oleh tahap
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1

Untuk memanfaatkan indeks, Anda harus melakukannya di tahap pertama alur Anda. Dan di sini, Anda harus menggunakan tahapan

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
_9 atau
{
  university : 'USAL',
  name : 'Computer Science',
  level : 'Excellent'
}
{
  university : 'USAL',
  name : 'Electronics',
  level : 'Intermediate'
}
{
  university : 'USAL',
  name : 'Communication',
  level : 'Excellent'
}
1

Kami dapat memeriksa apakah kueri menggunakan indeks melalui metode

{ "country" : "Spain", "city" : "Salamanca", "name" : "USAL" }
{ "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }
7

use 3tdb
db.universities.insert([
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'USAL',
  location : {
    type : 'Point',
    coordinates : [ -5.6722512,17, 40.9607792 ]
  },
  students : [
    { year : 2014, number : 24774 },
    { year : 2015, number : 23166 },
    { year : 2016, number : 21913 },
    { year : 2017, number : 21715 }
  ]
},
{
  country : 'Spain',
  city : 'Salamanca',
  name : 'UPSA',
  location : {
    type : 'Point',
    coordinates : [ -5.6691191,17, 40.9631732 ]
  },
  students : [
    { year : 2014, number : 4788 },
    { year : 2015, number : 4821 },
    { year : 2016, number : 6550 },
    { year : 2017, number : 6125 }
  ]
}
])
_3

Anda selalu dapat melihat rencana

{ "country" : "Spain", "city" : "Salamanca", "name" : "USAL" }
{ "country" : "Spain", "city" : "Salamanca", "name" : "UPSA" }
_7 dari kueri agregasi apa pun sebagai diagram atau dalam JSON dengan mengeklik tab Jelaskan

Mongodb agregat satu ke satu

Saya telah memperkenalkan pipa agregasi MongoDB dan mendemonstrasikan dengan contoh bagaimana menggunakan hanya beberapa tahapan

Semakin banyak Anda menggunakan MongoDB, semakin penting pipa agregasi dalam memungkinkan Anda melakukan semua tugas pelaporan, transformasi, dan kueri lanjutan yang sangat integral dengan pekerjaan pengembang basis data

Dengan proses pipeline yang lebih kompleks, semakin penting untuk memeriksa dan men-debug input dan output dari setiap tahap

Selalu ada titik di mana seseorang perlu menempelkan pipa agregasi yang berkembang ke dalam IDE untuk MongoDB seperti Studio 3T, dengan Editor Agregasi bawaan, sehingga Anda dapat men-debug setiap tahap secara mandiri

Bagaimana cara membuat hubungan satu ke satu di MongoDB?

Implementasi Relasi menggunakan Referensi . Dokumen dalam kumpulan karyawan berisi bidang alamat yang memiliki nilai _id yang ada dalam kumpulan alamat. Ini membentuk hubungan satu-ke-satu.

Bagaimana cara menggabungkan dua koleksi di MongoDB menggunakan agregat?

Kita dapat menggabungkan dokumen pada koleksi di MongoDB dengan menggunakan fungsi $lookup (Aggregation) . $lookup(Aggregation) membuat gabungan kiri luar dengan koleksi lain dan membantu memfilter data dari data gabungan.

Apakah MongoDB bagus untuk agregat?

Seperti banyak sistem database lainnya, MongoDB memungkinkan Anda melakukan berbagai operasi agregasi . Ini memungkinkan Anda untuk memproses rekaman data dalam berbagai cara, seperti mengelompokkan data, mengurutkan data ke dalam urutan tertentu, atau menyusun ulang dokumen yang dikembalikan, serta memfilter data dengan kueri.

Metode agregasi mana yang lebih disukai untuk digunakan oleh MongoDB?

Pipeline menyediakan agregasi data yang efisien menggunakan operasi asli dalam MongoDB, dan merupakan metode pilihan untuk agregasi data dalam MongoDB. Pipa agregasi dapat beroperasi pada kumpulan pecahan.