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

MongoDB $max Aggregation Pipeline Operator

Di MongoDB, $max operator pipeline agregasi mengembalikan nilai maksimum dari sebuah ekspresi.

Sintaks

$max operator mendukung dua sintaks.

Sintaks 1

{ $max: <expression> } 

Sintaks 2:

{ $max: [ <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, $max mengembalikan nilai maksimum 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 $max dalam hubungannya dengan $group untuk mengembalikan nilai maksimum 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 $max untuk mengembalikan nilai maksimum weight kolom untuk setiap grup:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            max: { $max: "$weight" }
          }
     }
   ]
) 

Hasil:

{ "_id" :"Kangaroo", "max" :200 }{ "_id" :"Kucing", "max" :12 }{ "_id" :"Anjing", "max" :30 } 

Array

Contoh ini berlaku $max 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 $max ke scores kolom di setiap dokumen:

db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            max: { $max: "$scores" }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "player" :"Homer", "max" :8 }{ "_id" :2, "player" :"Marge", "max" :18 }{ "_id" :3, "player" :"Bart", "max" :15 }{ "_id" :4, "player" :"Brian", "max" :7 }{ "_id" :5, "player" :"Farnsworth ", "max" :null }{ "_id" :6, "player" :"Meg", "max" :null }{ "_id" :7, "player" :"Ron", "max" :null } 

Dalam hal ini, empat dokumen pertama mengembalikan nilai maksimum 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 $max dengan lebih dari satu argumen. $max kemudian mengembalikan nilai maksimum 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 $max untuk mengembalikan nilai maksimum dari a , b , c , dan d bidang:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "max" :500 }

Dalam hal ini, 500 adalah nilai maksimum.

Bidang Tidak Ada

Saat menggunakan sintaks multi-argumen, $max 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:
          {
            max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Hasil:

{ "_id" :1, "max" :500 }

Dalam hal ini saya memberikan bidang tambahan ($e ) yang tidak ada dalam dokumen. $max menghitung nilai maksimum berdasarkan sisa bidang yang lakukan ada.

Namun, inilah yang terjadi ketika tidak ada bidang yang ada:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            result: { $max: [ "$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",
            max: { $max: "$oops!" }
          }
     }
   ]
) 

Hasil:

{ "_id" :"Anjing", "max" :null }{ "_id" :"Kangaroo", "max" :null }{ "_id" :"Kucing", "max" :null } 

Membandingkan Berbagai Jenis

$max operator membandingkan nilai dan tipe. Jika nilainya berbeda jenis, $max menghitung nilai maksimum berdasarkan urutan perbandingan BSON.

Misalkan koleksi kami berisi dokumen-dokumen berikut:

{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 1 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"1" }{ "_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 $max ke dokumen-dokumen itu:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
) 

Hasil:

{ "_id" :2, "max" :[ 1 ] }{ "_id" :3, "max" :"1" }{ "_id" :4, "max" :"Dua" }{ " _id" :5, "max" :ISODate("2000-01-03T23:30:15.100Z") }{ "_id" :6, "max" :ISODate("1999-01-03T23:30:15.100Z" ) }

dokumen dengan _id dari 2 , array lebih besar dari angka, sehingga array dikembalikan (meskipun elemennya adalah angka yang lebih kecil dari beberapa angka lainnya).

Dokumen 3:String lebih besar dari angka, sehingga string dikembalikan.

Dokumen 4:Semua bidang adalah string, jadi Two adalah string terbesar.

Dokumen 5:Dua tanggal diberikan, dan tanggal berikutnya dikembalikan.

Dokumen 6:Dalam hal ini, objek Tanggal dan string tanggal disediakan. Objek tanggal lebih besar dari string, dan objek Tanggal dikembalikan (meskipun tanggalnya lebih awal dari string).

Tahap yang Tersedia

$max 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. Bagaimana cara membuat Gambar Mongo Docker dengan koleksi dan data default?

  2. Yang Perlu Diketahui Saat Mulai Bekerja dengan MongoDB dalam Produksi - Sepuluh Tips

  3. Mustahil untuk mendapatkan properti dari objek luwak

  4. Urutan tanggapan ke MongoDB $ dalam kueri?

  5. mongodb.conf bind_ip =127.0.0.1 tidak berfungsi tetapi 0.0.0.0 berfungsi