MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB $round

W MongoDB $round Operator potoku agregacji zaokrągla liczbę do liczby całkowitej lub do określonego miejsca dziesiętnego.

Masz możliwość określenia, o ile miejsc dziesiętnych należy zaokrąglić liczbę. Aby to zrobić, przekaż drugi argument. Pierwszy argument to liczba do zaokrąglenia, a drugi (opcjonalny) argument to liczba miejsc dziesiętnych, do których należy go zaokrąglić.

Przykład

Załóżmy, że mamy kolekcję o nazwie test z następującymi dokumentami:

{ "_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 }

Możemy użyć $round operator do zaokrąglania wartości w data pole:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" ] }
          }
     }
   ]
)

Wynik:

{ "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 }

Określ miejsce dziesiętne

Mamy możliwość użycia drugiego argumentu, aby określić, do ilu miejsc dziesiętnych należy zaokrąglić liczbę.

Przykład:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 1 ] }
          }
     }
   ]
)

Wynik:

{ "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 }

Ujemne miejsca dziesiętne

Drugi argument może być dowolnym poprawnym wyrażeniem, które daje w wyniku liczbę całkowitą z przedziału od -20 do 100, z wyłączeniem. Dlatego możesz określić ujemne miejsce dziesiętne.

Gdy to zrobisz, liczba zostanie zaokrąglona do lewej strony miejsca dziesiętnego. Jeśli wartość bezwzględna ujemnej liczby całkowitej jest większa niż liczba, wynikiem jest 0 .

Załóżmy, że do naszej kolekcji dodamy następujące dokumenty:

{ "_id" : 9, "data" : 8111.32 }
{ "_id" : 10, "data" : 8514.321 }
{ "_id" : 11, "data" : 8999.454 }

Oto przykład użycia różnych ujemnych miejsc dziesiętnych podczas stosowania $round do tych dokumentów:

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()

Wynik:

{
	"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
}

Dziesiętne miejsce zera

Gdy podasz miejsce dziesiętne 0$round operator zaokrągla pierwszą cyfrę po prawej stronie przecinka i zwraca zaokrągloną wartość całkowitą.

Przykład:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 0 ] }
          }
     }
   ]
)

Wynik:

{ "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 }

Typy liczb

Liczba do zaokrąglenia może być dowolnym prawidłowym wyrażeniem, którego wynikiem jest liczba całkowita, podwójna, dziesiętna lub długa. Zwracana wartość odpowiada typowi danych wartości wejściowej.

Jeśli więc dodamy do naszej kolekcji następujące dokumenty:

{ "_id" : 12, "data" : NumberDecimal("128.4585") }
{ "_id" : 13, "data" : NumberDecimal("128.12345678912") }

Możemy zastosować $round do data pole:

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()

Wynik:

{
	"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")
}

Zaokrąglanie do zerowych miejsc dziesiętnych

Jeśli drugim argumentem jest null , wynik to null .

Przykład:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", null ] }
          }
     }
   ]
)

Wynik:

{ "data" : 8.99, "rounded" : null }
{ "data" : 8.45, "rounded" : null }
{ "data" : 8.451, "rounded" : null }

Zaokrąglanie wartości zerowej

Jeśli wartość do zaokrąglenia to null , wynik to null .

Załóżmy, że dodajemy do kolekcji następujący dokument:

{ "_id" : 14, "data" : null }

I używamy $round aby zaokrąglić wartość null:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 14 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", null ] }
          }
     }
   ]
)

Wynik:

{ "data" : null, "rounded" : null }

Zaokrąglanie nieskończoności

Jeśli liczba do zaokrąglenia to Infinity , wynikiem jest Infinity . Podobnie, jeśli jest to -Infinity , wynikiem jest -Infinity .

Dodajmy dwa dokumenty z takimi wartościami:

{ "_id" : 15, "data" : Infinity }
{ "_id" : 16, "data" : -Infinity }

I zaokrąglmy je:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 15, 16 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 2 ] }
          }
     }
   ]
)

Wynik:

{ "data" : Infinity, "rounded" : Infinity }
{ "data" : -Infinity, "rounded" : -Infinity }

Zaokrąglanie NaN

Zaokrąglanie NaN wyniki w NaN .

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" * 2 ] }
          }
     }
   ]
)

Wynik:

{ "data" : 8.99, "rounded" : NaN }
{ "data" : 8.45, "rounded" : NaN }

Typy nieliczbowe

Jeśli spróbujesz zaokrąglić wartość, która jest niewłaściwym typem danych (tzn. nie jest liczbą całkowitą, podwójną, dziesiętną lub długą), zostanie zwrócony błąd.

Załóżmy, że do naszej kolekcji dodamy następujący dokument:

{ "_id" : 17, "data" : "Thirty five" }

A teraz próbujemy zaokrąglić data pole:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 17 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" ] }
          }
     }
   ]
)

Wynik:

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. Jak przechowywać wyniki z dynamicznie generowanych formularzy w MongoDb?

  2. Zapisz podzbiór kolekcji MongoDB w innej kolekcji

  3. Dlaczego mój schemat nie dodaje wartości domyślnych w tablicach mangusty?

  4. Pobierz wartości jako tablicę elementów po $lookup

  5. Chmura hybrydowa a pełna chmura publiczna — zalety i wady