Di MongoDB, $min
operator pipeline agregasi mengembalikan nilai minimum dari sebuah ekspresi.
Sintaks
$min
operator mendukung dua sintaks.
Sintaks 1
{ $min: <expression> }
Sintaks 2:
{ $min: [ <expression1>, <expression2> ... ] }
Sintaks pertama menerima satu argumen dan sintaks kedua menerima beberapa argumen.
Saat digunakan di $group
tahap, Anda hanya dapat menggunakan sintaks pertama. Dalam hal ini, $min
mengembalikan nilai minimum yang dihasilkan dari penerapan ekspresi ke setiap dokumen dalam grup dokumen yang berbagi grup yang sama berdasarkan kunci.
Contoh Sintaks 1 (Argumen Tunggal)
Berikut adalah beberapa contoh yang menggunakan sintaks argumen tunggal.
Dokumen yang Dikelompokkan
Contoh ini menggunakan $min
dalam hubungannya dengan $group
untuk mengembalikan nilai minimum dari sekelompok dokumen yang dikelompokkan berdasarkan kunci.
Misalkan kita memiliki koleksi yang disebut pets
dengan dokumen sebagai berikut:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Anjing", "berat" :10 }{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Kangaroo", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Kangaroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Kangaroo", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Anjing", "berat" :30 }
Kami dapat mengelompokkan dokumen-dokumen ini berdasarkan type
bidang, lalu gunakan $min
untuk mengembalikan nilai minimum weight
kolom untuk setiap grup:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
min: { $min: "$weight" }
}
}
]
)
Hasil:
{ "_id" :"Kangaroo", "min" :100 }{ "_id" :"Anjing", "min" :10 }{ "_id" :"Kucing", "min" :7 }Array
Contoh ini berlaku
$min
ke satu dokumen yang berisi bidang dengan larik nilai.Opsi ini hanya tersedia saat menggunakan sintaks argumen tunggal. Array diabaikan saat menggunakan sintaks multi-argumen (lebih lanjut tentang ini di bawah).
Misalkan kita memiliki koleksi yang disebut
players
dengan dokumen sebagai berikut:{ "_id" :1, "player" :"Homer", "skor" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Marge", "skor" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "pemain" :"Bart", "skor" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "skor" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "skor" :[ ] }{ "_id" :6, "player" :"Meg", "skor" :null }{ "_id" :7, "player" :"Ron" }Kami dapat menerapkan
$min
kescores
kolom di setiap dokumen:db.players.aggregate( [ { $project: { player: 1, min: { $min: "$scores" } } } ] )
Hasil:
{ "_id" :1, "player" :"Homer", "min" :1 }{ "_id" :2, "player" :"Marge", "min" :0 }{ "_id" :3, "player" :"Bart", "min" :0 }{ "_id" :4, "player" :"Brian", "min" :7 }{ "_id" :5, "player" :"Farnsworth ", "min" :null }{ "_id" :6, "player" :"Meg", "min" :null }{ "_id" :7, "player" :"Ron", "min" :null }Dalam hal ini, empat dokumen pertama mengembalikan nilai minimum dari berbagai angka yang ada dalam lariknya masing-masing.
Dalam kasus dokumen 4, ini sama dengan angka, karena hanya ada satu angka dalam larik.
Dokumen 5 mengembalikan
null
karena kami menyediakan array kosong.Dokumen 6 mengembalikan
null
karena kami menyediakannull
sebagai argumen.Dokumen 7 mengembalikan
null
karena bidangnya bahkan tidak ada.Contoh Sintaks 2 (Beberapa Argumen)
Sintaks kedua melibatkan penyediaan
$min
dengan lebih dari satu argumen.$min
kemudian mengembalikan nilai minimum dari semua argumen yang diberikan.Misalkan kita memiliki koleksi yang disebut
data
dengan dokumen berikut:{ "_id" :1, "a" :10, "b" :500, "c" :-900, "d" :4 }Kita bisa menggunakan
$min
untuk mengembalikan nilai minimum daria
,b
,c
, dand
bidang:db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Hasil:
{ "_id" :1, "min" :-900 }Dalam hal ini,
-900
adalah nilai minimum.Bidang Tidak Ada
Saat menggunakan sintaks multi-argumen,
$min
mengabaikan bidang yang hilang. Artinya, jika Anda menyediakan bidang yang tidak ada, itu akan mengabaikannya. Jika tidak ada bidang yang ada, maka akan mengembalikannull
.Contoh:
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Hasil:
{ "_id" :1, "min" :-900 }Dalam hal ini saya memberikan bidang tambahan (
$e
) yang tidak ada dalam dokumen.$min
menghitung nilai minimum berdasarkan bidang yang tersisa yang lakukan ada.Namun, inilah yang terjadi ketika tidak ada bidang yang ada:
db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { result: { $min: [ "$x", "$y", "$z" ] } } } ] )
Hasil:
{ "_id" :1, "result" :null }Hasilnya adalah
null
.Seperti yang kita lihat sebelumnya, saat menggunakan sintaks argumen tunggal, bidang yang hilang menghasilkan
null
.Contoh:
db.pets.aggregate( [ { $group: { _id: "$type", min: { $min: "$oops!" } } } ] )
Hasil:
{ "_id" :"Anjing", "min" :null }{ "_id" :"Kucing", "min" :null }{ "_id" :"Kanguru", "min" :null }Membandingkan Berbagai Jenis
$min
operator membandingkan nilai dan tipe. Jika nilainya berbeda jenis,$min
menghitung nilai minimum berdasarkan urutan perbandingan BSON.Misalkan koleksi kami berisi dokumen-dokumen berikut:
{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 0 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"0" }{ "_id" :4, "a" :"Satu", "b" :"Dua", "c" :"Tiga", "d" :"Empat" }{ "_id" :5, "a" :ISODate("1999-01-03T23:30:15.100Z"), "b" :ISODate("2000-01-03T23:30:15.100Z")}{ "_id" :6, "a" :ISODate("1999-01-03T23:30:15.100Z"), "b" :"2000-01-03T23:30:15.100Z"}Dengan pengecualian dokumen 4, masing-masing dokumen tersebut menggunakan jenis campuran (setidaknya ada satu jenis yang berbeda dengan yang lain di seluruh bidang data). Dokumen 4 menggunakan string di keempat bidang.
Inilah yang terjadi ketika kita menerapkan
$min
ke dokumen-dokumen itu:db.data.aggregate( [ { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Hasil:
{ "_id" :2, "min" :1 }{ "_id" :3, "min" :1 }{ "_id" :4, "min" :"Empat" }{ "_id" :5 , "min" :ISODate("1999-01-03T23:30:15.100Z") }{ "_id" :6, "min" :"2000-01-03T23:30:15.100Z" }Mengenai dokumen dengan
_id
dari2
, angka lebih kecil dari array, jadi angka1
dikembalikan (meskipun array berisi angka yang lebih kecil dari semua angka lainnya).Dokumen 3:Angka lebih kecil dari string, sehingga angka terendah dikembalikan.
Dokumen 4:Semua bidang adalah string, jadi
Four
adalah string minimum.Dokumen 5:Dua tanggal diberikan, dan tanggal sebelumnya dikembalikan.
Dokumen 6:Dalam hal ini, objek Tanggal dan string tanggal disediakan. String kurang dari objek Date, dan string dikembalikan (meskipun tanggalnya lebih lambat dari objek Date).
Tahap yang Tersedia
$min
tersedia dalam tahapan berikut:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
tahap yang menyertakan$expr
ekspresi