Di MongoDB, $round
operator pipeline agregasi membulatkan angka ke bilangan bulat utuh atau ke tempat desimal tertentu.
Anda memiliki pilihan untuk menentukan berapa banyak tempat desimal untuk membulatkan angka. Untuk melakukan ini, berikan argumen kedua. Argumen pertama adalah angka yang akan dibulatkan, dan argumen kedua (opsional) adalah jumlah tempat desimal yang akan dibulatkan.
Contoh
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen sebagai berikut:
{ "_id" : 1, "data" : 8.99 } { "_id" : 2, "data" : 8.45 } { "_id" : 3, "data" : 8.451 } { "_id" : 4, "data" : -8.99 } { "_id" : 5, "data" : -8.45 } { "_id" : 6, "data" : -8.451 } { "_id" : 7, "data" : 8 } { "_id" : 8, "data" : 0 }
Kita dapat menggunakan $round
operator untuk membulatkan nilai dalam data
bidang:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8 } { "data" : 8.451, "rounded" : 8 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8 } { "data" : -8.451, "rounded" : -8 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 }
Tentukan Tempat Desimal
Kami memiliki opsi untuk menggunakan argumen kedua untuk menentukan berapa banyak tempat desimal yang akan digunakan untuk membulatkan angka.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 1 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8.4 } { "data" : 8.451, "rounded" : 8.5 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8.4 } { "data" : -8.451, "rounded" : -8.5 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 }
Tempat Desimal Negatif
Argumen kedua dapat berupa ekspresi valid apa pun yang menghasilkan bilangan bulat antara -20 dan 100, eksklusif. Oleh karena itu, Anda dapat menentukan tempat desimal negatif.
Saat Anda melakukan ini, angka dibulatkan ke kiri tempat desimal. Jika nilai mutlak bilangan bulat negatif lebih besar dari angka, hasilnya adalah 0
.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 9, "data" : 8111.32 } { "_id" : 10, "data" : 8514.321 } { "_id" : 11, "data" : 8999.454 }
Berikut adalah contoh penggunaan berbagai tempat desimal negatif saat menerapkan $round
ke dokumen-dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10, 11 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $round: [ "$data", -1 ] },
b: { $round: [ "$data", -2 ] },
c: { $round: [ "$data", -3 ] },
d: { $round: [ "$data", -4 ] },
e: { $round: [ "$data", -5 ] }
}
}
]
).pretty()
Hasil:
{ "data" : 8111.32, "a" : 8110, "b" : 8100, "c" : 8000, "d" : 10000, "e" : 0 } { "data" : 8514.321, "a" : 8510, "b" : 8500, "c" : 9000, "d" : 10000, "e" : 0 } { "data" : 8999.454, "a" : 9000, "b" : 9000, "c" : 9000, "d" : 10000, "e" : 0 }
Tempat Desimal dari Nol
Saat Anda memberikan tempat desimal 0
, $round
operator membulatkan menggunakan digit pertama di sebelah kanan desimal dan mengembalikan nilai bilangan bulat yang dibulatkan.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 0 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "rounded" : 9 } { "data" : 8.45, "rounded" : 8 } { "data" : 8.451, "rounded" : 8 } { "data" : -8.99, "rounded" : -9 } { "data" : -8.45, "rounded" : -8 } { "data" : -8.451, "rounded" : -8 } { "data" : 8, "rounded" : 8 } { "data" : 0, "rounded" : 0 } { "data" : 8111.32, "rounded" : 8111 } { "data" : 8514.321, "rounded" : 8514 } { "data" : 8999.454, "rounded" : 8999 }
Jenis Angka
Angka yang akan dibulatkan dapat berupa ekspresi valid apa pun yang menghasilkan bilangan bulat, ganda, desimal, atau panjang. Nilai yang dikembalikan cocok dengan tipe data dari nilai input.
Jadi jika kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 12, "data" : NumberDecimal("128.4585") } { "_id" : 13, "data" : NumberDecimal("128.12345678912") }
Kita dapat menerapkan $round
ke data
bidang:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 12, 13 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $round: [ "$data", -1 ] },
b: { $round: [ "$data", 0 ] },
c: { $round: [ "$data", 3 ] },
d: { $round: [ "$data", 4 ] },
e: { $round: [ "$data", 5 ] }
}
}
]
).pretty()
Hasil:
{ "data" : NumberDecimal("128.4585"), "a" : NumberDecimal("1.3E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.458"), "d" : NumberDecimal("128.4585"), "e" : NumberDecimal("128.45850") } { "data" : NumberDecimal("128.12345678912"), "a" : NumberDecimal("1.3E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.123"), "d" : NumberDecimal("128.1235"), "e" : NumberDecimal("128.12346") }
Pembulatan ke Tempat Desimal Null
Jika argumen kedua adalah null
, hasilnya null
.
Contoh:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", null ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "rounded" : null } { "data" : 8.45, "rounded" : null } { "data" : 8.451, "rounded" : null }
Membulatkan Nilai Null
Jika nilai yang akan dibulatkan adalah null
, hasilnya null
.
Misalkan kita menambahkan dokumen berikut ke koleksi:
{ "_id" : 14, "data" : null }
Dan kami menggunakan $round
untuk membulatkan nilai nol:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", null ] }
}
}
]
)
Hasil:
{ "data" : null, "rounded" : null }
Membulatkan Tak Terhingga
Jika angka yang akan dibulatkan adalah Infinity
, hasilnya adalah Infinity
. Demikian juga, jika -Infinity
, hasilnya adalah -Infinity
.
Mari kita tambahkan dua dokumen dengan nilai seperti itu:
{ "_id" : 15, "data" : Infinity } { "_id" : 16, "data" : -Infinity }
Dan mari kita bulatkan:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 15, 16 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data", 2 ] }
}
}
]
)
Hasil:
{ "data" : Infinity, "rounded" : Infinity } { "data" : -Infinity, "rounded" : -Infinity }
Pembulatan NaN
Pembulatan NaN
menghasilkan NaN
.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" * 2 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "rounded" : NaN } { "data" : 8.45, "rounded" : NaN }
Tipe Non-Numerik
Jika Anda mencoba membulatkan nilai dengan tipe data yang salah (yaitu bukan bilangan bulat, ganda, desimal, atau panjang), kesalahan akan ditampilkan.
Misalkan kita menambahkan dokumen berikut ke koleksi kita:
{ "_id" : 17, "data" : "Thirty five" }
Dan sekarang kita coba membulatkan data
bidang:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 17 ] } } },
{
$project:
{
_id: 0,
data: 1,
rounded: { $round: [ "$data" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$round only supports numeric types, not string", "code" : 51081, "codeName" : "Location51081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1