sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB $runde

I MongoDB er $round aggregeringspipeline-operatør afrunder et tal til et helt heltal eller til en specificeret decimal.

Du har mulighed for at angive, hvor mange decimaler tallet skal afrundes til. For at gøre dette skal du sende et andet argument. Det første argument er antallet, der skal afrundes, og det andet (valgfrit) argument er antallet af decimaler, der skal afrundes til.

Eksempel

Antag, at vi har en samling kaldet test med følgende dokumenter:

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

Vi kan bruge $round operatør for at afrunde værdierne i data felt:

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

Resultat:

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

Angiv en decimal

Vi har mulighed for at bruge et andet argument til at angive, hvor mange decimaler der skal afrundes tallet for.

Eksempel:

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

Resultat:

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

Negative decimaler

Det andet argument kan være et hvilket som helst gyldigt udtryk, der løses til et heltal mellem -20 og 100, eksklusivt. Derfor kan du angive en negativ decimal.

Når du gør dette, afrundes tallet til venstre for decimalen. Hvis den absolutte værdi af det negative heltal er større end tallet, er resultatet 0 .

Antag, at vi føjer følgende dokumenter til vores samling:

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

Her er et eksempel på brug af forskellige negative decimaler, når du anvender $round til disse dokumenter:

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

Resultat:

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

Nul decimal

Når du angiver en decimal på 0$round operator runder med det første ciffer til højre for decimalen og returnerer den afrundede heltalværdi.

Eksempel:

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

Resultat:

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

Taltyper

Tallet, der skal afrundes, kan være et hvilket som helst gyldigt udtryk, der opløses til et heltal, dobbelt, decimal eller langt. Returværdien matcher datatypen for inputværdien.

Så hvis vi tilføjer følgende dokumenter til vores samling:

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

Vi kan anvende $round til data felt:

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

Resultat:

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

Afrunding til nul decimaler

Hvis det andet argument er null , resultatet er null .

Eksempel:

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

Resultat:

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

Afrunding af en nulværdi

Hvis værdien, der skal afrundes, er null , resultatet er null .

Antag, at vi tilføjer følgende dokument til samlingen:

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

Og vi bruger $round for at afrunde nulværdien:

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

Resultat:

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

Runder uendeligt

Hvis tallet, der skal afrundes, er Infinity , resultatet er Infinity . Ligeledes hvis det er -Infinity , resultatet er -Infinity .

Lad os tilføje to dokumenter med sådanne værdier:

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

Og lad os runde dem:

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

Resultat:

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

Afrunding af NaN

Afrunding af NaN resulterer i NaN .

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

Resultat:

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

Ikke-numeriske typer

Hvis du forsøger at afrunde en værdi, der er den forkerte datatype (dvs. den ikke er et heltal, dobbelt, decimal eller lang), returneres en fejl.

Antag, at vi tilføjer følgende dokument til vores samling:

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

Og nu prøver vi at runde data felt:

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

Resultat:

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. Hvordan bruger jeg forbindelsespuljer korrekt i redis?

  2. Heroku Redis - GUI og hukommelsesoptimering

  3. FEJL:Kan ikke skrive pid-fil til /var/run/mongodb/mongod.pid:Ingen sådan fil eller mappe inf fedora 20

  4. Sådan laver du forespørgsler med tidszoneindstillinger i Mongodb