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

MongoDB $bulat

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

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:apa perbedaan antara Model.create dan Collection.insert

  2. cara mengelola bidang _id saat menggunakan POCO dengan driver mongodb c#

  3. MongoDB $tarik

  4. Koleksi dinamis $lookup Mongodb

  5. Data musim semi menggunakan mongo ATAU dalam Kueri