Di MongoDB, Anda dapat menggunakan $subtract
operator pipa agregasi untuk mengurangi angka dan/atau tanggal.
Khususnya, $subtract
dapat melakukan tiga hal berikut:
- Kurangi dua angka untuk mengembalikan selisihnya
- Kurangi angka (dalam milidetik) dari tanggal dan kembalikan tanggal yang dihasilkan
- Kurangi dua tanggal untuk mengembalikan selisih dalam milidetik
$subtract
operator menerima nilai sebagai argumen. Argumen dapat berupa ekspresi apa pun yang valid selama argumen tersebut menghasilkan angka dan/atau tanggal. Untuk mengurangi angka dari tanggal, tanggal harus menjadi argumen pertama..
Contoh Data
Misalkan kita memiliki koleksi yang disebut data
dengan dokumen berikut:
{ "_id" :1, "a" :20000, "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021- 01-03T23:30:15.100Z")}
Kurangi Bilangan
Kita dapat menggunakan $subtract
operator untuk mengurangi a
bidang dari b
lapangan (atau sebaliknya).
Contoh:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
)
Hasil:
{ "a" :20000, "b" :250, "hasil" :1975 }
Mengurangi Angka dari Tanggal
Jika argumen pertama adalah tanggal dan argumen kedua adalah angka, $subtract
operator mengurangi angka dari tanggal dalam milidetik.
Contoh:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$start", "$b" ] } }
}
]
).pretty()
Hasil:
{ "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "result" :ISODate("2021-01-02T23:59:59.750Z")}Kita dapat melihat bahwa 250 milidetik telah dikurangi dari tanggal.
Saat kita mengurangi angka dari tanggal, tanggal harus menjadi argumen pertama dengan angka sebagai argumen kedua.
Inilah yang terjadi jika kita mengalihkan argumen:
db.data.aggregate( [ { $project: { _id: 0, b: 1, start: 1, result: { $subtract: [ "$b", "$start" ] } } } ] ).pretty()
Hasil:
pengecualian yang tidak tertangkap:Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"cant $subtract adate from a double", "code" :16556, "codeName" :"Location16556"} :agregat gagal :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example@ sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@(shell )::1:1Kami mendapatkan kesalahan yang memberi tahu kami bahwa itu tidak dapat mengurangi tanggal dari ganda.
Mengembalikan Selisih Antara Dua Tanggal
Jika kedua argumen adalah tanggal, maka
$subtract
operator mengembalikan perbedaan antara dua tanggal dalam milidetik.Contoh:
db.data.aggregate( [ { $project: { _id: 0, start: 1, end: 1, result: { $subtract: [ "$end", "$start" ] } } } ] ).pretty()
Hasil:
{ "mulai" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021-01-03T23:30:15.100Z"), "hasil" :NumberLong(84615100 )}Jika kita mengganti tanggal, hasilnya menjadi nilai negatif:
db.data.aggregate( [ { $project: { _id: 0, start: 1, end: 1, result: { $subtract: [ "$start", "$end" ] } } } ] ).pretty()
Hasil:
{ "mulai" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021-01-03T23:30:15.100Z"), "result" :NumberLong(- 84615100)}Melewati Jumlah Argumen yang Salah
$subtract
operator menerima tepat dua argumen. Melewati jumlah argumen yang salah menghasilkan kesalahan.Contoh:
db.data.aggregate( [ { $project: { result: { $subtract: [ "$a" ] } } } ] )
Hasil:
pengecualian yang tidak tertangkap:Kesalahan:perintah gagal:{ "ok" :0, "errmsg" :"$project tidak valid ::disebabkan oleh ::Ekspresi $subtract membutuhkan tepat 2 argumen. 1 diteruskan.", "kode" :16020, "codeName" :"Location16020"} :agregat gagal :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:14example@sqldat .com/mongo/shell/assert.js:618:[email protected]/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected] /mongo/shell/collection.js:1046:12@(kulit)::1:1Meneruskan Nilai Null
Melewati dua
null
nilai menghasilkannull
dikembalikan.Contoh:
db.data.aggregate( [ { $project: { result: { $subtract: [ null, null ] } } } ] )
Hasil:
{ "_id" :1, "result" :null }