MongoDB memiliki $max
operator yang memungkinkan Anda memperbarui nilai bidang hanya jika nilai yang ditentukan lebih besar dari nilai bidang saat ini.
Dengan kata lain, jika $max
nilai lebih besar dari nilai saat ini dalam dokumen, $max
nilai digunakan. Jika tidak, nilai dokumen tetap tidak berubah.
Contoh
Misalkan kita memiliki koleksi seperti ini:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 230 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Dan bayangkan kami memperbarui koleksi setelah setiap latihan tanpa lift terbaru. Dalam hal ini, kami hanya menginginkan bestLift
lapangan akan diperbarui jika lift terbaru kami lebih berat dari lift terbaik kami sebelumnya (yaitu berat saat ini yang tercantum untuk masing-masing lift).
Dalam hal ini kita bisa menggunakan $max
operator untuk mencapai hasil tersebut.
Contoh:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 240 } }
)
Keluaran:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Pesan ini memberi tahu kami bahwa satu dokumen cocok dan telah diperbarui.
Yuk cek lagi koleksinya.
db.workout.find()
Hasil:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Kita dapat melihat bahwa bestLift
bidang untuk dokumen pertama telah diperbarui dengan nilai baru. Ini karena 240 lebih tinggi dari nilai sebelumnya yaitu 230.
Saat Nilai Lebih Rendah
Ketika nilai ditentukan dengan $max
lebih rendah dari nilai yang ada dalam dokumen, tidak ada yang diperbarui.
Contoh:
db.workout.update(
{ _id: 1 },
{ $max: { bestLift: 220 } }
)
Keluaran:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
Kami dapat melihat dari pesan bahwa tidak ada yang diperbarui.
Yuk cek lagi koleksinya.
db.workout.find()
Hasil:
{ "_id" : 1, "exercise" : "deadlift", "bestLift" : 240 } { "_id" : 2, "exercise" : "benchpress", "bestLift" : 100 } { "_id" : 3, "exercise" : "squat", "bestLift" : 210 }
Kita dapat melihat bahwa nilainya tetap pada 240, meskipun kita mencoba untuk memperbaruinya menjadi 220. Hal ini diharapkan, karena kita menggunakan $max
.
Tanggal
Anda dapat menggunakan $max
pada bidang tanggal.
Misalkan kita memiliki collection
disebut langganan dengan dokumen berikut:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Mari kita coba perbarui tanggal dengan tanggal yang lebih awal dari tanggal saat ini di dokumen.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2020-01-01") } }
)
Di sini, kami mencoba memperbarui tahun dari 2021
ke 2021
. Mengingat tanggal baru lebih awal dari yang sudah ada, kami mendapatkan yang berikut.
db.subscriptions.find()
Hasil:
{ "_id" : 1, "expiry" : ISODate("2021-01-01T00:00:00Z") }
Seperti yang diharapkan, tidak ada yang diperbarui.
Mari kita coba memperbaruinya di lain waktu.
db.subscriptions.update(
{ _id: 1 },
{ $max: { expiry: new Date("2022-01-01") } }
)
Keluaran:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Kita dapat melihat dari pesan bahwa dokumen telah diperbarui.
Mari kita periksa.
db.subscriptions.find()
Hasil:
{ "_id" : 1, "expiry" : ISODate("2022-01-01T00:00:00Z") }
Tanggal diperbarui seperti yang diharapkan.