Di MongoDB, $trunc
operator pipa agregasi memotong angka ke bilangan bulat utuh atau ke tempat desimal tertentu.
Anda memiliki opsi untuk menentukan berapa banyak tempat desimal yang akan dipotong nomornya. Untuk melakukan ini, berikan argumen kedua. Argumen pertama adalah angka yang akan dipotong, dan argumen kedua (opsional) adalah jumlah tempat desimal yang akan dipotong.
Menghilangkan argumen kedua akan memotong semua digit di sebelah kanan desimal dan mengembalikan seluruh nilai integer.
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 $trunc
operator untuk memotong nilai dalam data
bidang:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "truncated" : 8 } { "data" : 8.45, "truncated" : 8 } { "data" : 8.451, "truncated" : 8 } { "data" : -8.99, "truncated" : -8 } { "data" : -8.45, "truncated" : -8 } { "data" : -8.451, "truncated" : -8 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 }
Perhatikan bahwa $trunc
tidak membulatkan angka seperti $round
melakukan. $trunc
operator hanya memotong nomor. Jika kita telah menerapkan $round
untuk koleksi ini, dokumen pertama dan keempat akan dibulatkan menjadi 9
dan -9
masing-masing.
Tentukan Tempat Desimal
Kami memiliki opsi untuk menggunakan argumen kedua untuk menentukan berapa banyak tempat desimal yang akan dipotong angkanya.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 1 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "truncated" : 8.9 } { "data" : 8.45, "truncated" : 8.4 } { "data" : 8.451, "truncated" : 8.4 } { "data" : -8.99, "truncated" : -8.9 } { "data" : -8.45, "truncated" : -8.4 } { "data" : -8.451, "truncated" : -8.4 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 }
Sekali lagi, ini hanya memotong nomor. Jika kita menggunakan $round
, itu akan membulatkan beberapa angka ini.
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.
Ketika Anda melakukan ini, nomor terpotong di sebelah kiri tempat desimal. Jika nilai mutlak bilangan bulat negatif lebih besar dari jumlah digit di sebelah kiri desimal, 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 $trunc
ke dokumen-dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 9, 10, 11 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $trunc: [ "$data", -1 ] },
b: { $trunc: [ "$data", -2 ] },
c: { $trunc: [ "$data", -3 ] },
d: { $trunc: [ "$data", -4 ] },
e: { $trunc: [ "$data", -5 ] }
}
}
]
).pretty()
Hasil:
{ "data" : 8111.32, "a" : 8110, "b" : 8100, "c" : 8000, "d" : 0, "e" : 0 } { "data" : 8514.321, "a" : 8510, "b" : 8500, "c" : 8000, "d" : 0, "e" : 0 } { "data" : 8999.454, "a" : 8990, "b" : 8900, "c" : 8000, "d" : 0, "e" : 0 }
Tempat Desimal dari Nol
Saat Anda memberikan tempat desimal 0
, $trunc
operator memotong semua digit di sebelah kanan desimal dan mengembalikan seluruh nilai bilangan bulat.
Contoh:
db.test.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 0 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "truncated" : 8 } { "data" : 8.45, "truncated" : 8 } { "data" : 8.451, "truncated" : 8 } { "data" : -8.99, "truncated" : -8 } { "data" : -8.45, "truncated" : -8 } { "data" : -8.451, "truncated" : -8 } { "data" : 8, "truncated" : 8 } { "data" : 0, "truncated" : 0 } { "data" : 8111.32, "truncated" : 8111 } { "data" : 8514.321, "truncated" : 8514 } { "data" : 8999.454, "truncated" : 8999 }
Jenis Angka
Angka yang akan dipotong dapat berupa ekspresi valid apa pun yang diubah menjadi 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 $trunc
ke data
bidang:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 12, 13 ] } } },
{
$project:
{
_id: 0,
data: 1,
a: { $trunc: [ "$data", -1 ] },
b: { $trunc: [ "$data", 0 ] },
c: { $trunc: [ "$data", 3 ] },
d: { $trunc: [ "$data", 4 ] },
e: { $trunc: [ "$data", 5 ] }
}
}
]
).pretty()
Hasil:
{ "data" : NumberDecimal("128.4585"), "a" : NumberDecimal("1.2E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.458"), "d" : NumberDecimal("128.4585"), "e" : NumberDecimal("128.45850") } { "data" : NumberDecimal("128.12345678912"), "a" : NumberDecimal("1.2E+2"), "b" : NumberDecimal("128"), "c" : NumberDecimal("128.123"), "d" : NumberDecimal("128.1234"), "e" : NumberDecimal("128.12345") }
Memotong 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,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "truncated" : null } { "data" : 8.45, "truncated" : null } { "data" : 8.451, "truncated" : null }
Memotong Nilai Null
Jika nilai yang akan dipotong adalah null
, hasilnya null
.
Misalkan kita menambahkan dokumen berikut ke koleksi:
{ "_id" : 14, "data" : null }
Dan kami menggunakan $trunc
untuk memotong nilai nol:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 14 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", null ] }
}
}
]
)
Hasil:
{ "data" : null, "truncated" : null }
Memotong Tak Terbatas
Jika angka yang akan dipotong 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 potong mereka:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 15, 16 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data", 2 ] }
}
}
]
)
Hasil:
{ "data" : Infinity, "truncated" : Infinity } { "data" : -Infinity, "truncated" : -Infinity }
Memotong NaN
Memotong NaN
menghasilkan NaN
.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" * 2 ] }
}
}
]
)
Hasil:
{ "data" : 8.99, "truncated" : NaN } { "data" : 8.45, "truncated" : NaN }
Tipe Non-Numerik
Jika Anda mencoba memotong 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 kami mencoba untuk memotong data
bidang:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 17 ] } } },
{
$project:
{
_id: 0,
data: 1,
truncated: { $trunc: [ "$data" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$trunc 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