MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $min Agregasi Pipeline Operator

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 ke scores 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 menyediakan null 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 dari a , b , c , dan d 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 mengembalikan null .

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 dari 2 , angka lebih kecil dari array, jadi angka 1 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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb memperbarui subdokumen yang sangat bersarang

  2. Apa itu Kursor di MongoDB?

  3. Mongo Pertanyaan kueri $gt,$lt

  4. Cara menggunakan mongoimport untuk mengimpor csv

  5. Elemen larik pembaruan Mongo (.NET driver 2.0)