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

MongoDB $trunc

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. pencarian elastis vs. MongoDB untuk memfilter aplikasi

  2. Urutan bidang MongoDB dan posisi dokumen berubah setelah pembaruan

  3. Membuat model untuk skema teman di luwak?

  4. Perbarui beberapa elemen dalam array di mongodb

  5. Menutupi PII di MongoDB, Cassandra, dan Elasticsearch dengan DarkShield:…