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

MongoDB $trunc

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

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

Udeladelse af det andet argument afkorter alle cifre til højre for decimalen og returnerer hele heltalsværdien.

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 $trunc operator for at afkorte værdierne i data felt:

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

Resultat:

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

Bemærk at $trunc afrunder ikke tal som $round gør. $trunc operatør afkorter simpelthen nummeret. Hvis vi havde anvendt $round til denne samling ville det første og det fjerde dokument være blevet afrundet til 9 og -9 hhv.

Angiv en decimal

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

Eksempel:

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

Resultat:

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

Igen, dette afkorter simpelthen tallet. Hvis vi havde brugt $round , ville det have rundet nogle af disse tal.

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, afkortes tallet til venstre for decimalen. Hvis den absolutte værdi af det negative heltal er større end antallet af cifre til venstre for decimalen, 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 $trunc til disse dokumenter:

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

Resultat:

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

Nul decimal

Når du angiver en decimal på 0 , $trunc operatoren afkorter alle cifre til højre for decimalen og returnerer hele heltalsværdien.

Eksempel:

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

Resultat:

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

Taltyper

Tallet, der skal afkortes, 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 $trunc til data felt:

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

Resultat:

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

Trunkering 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,
            truncated: { $trunc: [ "$data", null ] }
          }
     }
   ]
)

Resultat:

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

Trunkering af en nulværdi

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

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

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

Og vi bruger $trunc for at afkorte null-værdien:

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

Resultat:

{ "data" : null, "truncated" : null }

Truncating Infinity

Hvis tallet, der skal afkortes, 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 afkorte dem:

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

Resultat:

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

Trunkering af NaN

Afkorter NaN resulterer i NaN .

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

Resultat:

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

Ikke-numeriske typer

Hvis du forsøger at afkorte 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 afkorte data felt:

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

Resultat:

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. 'upsert' i et indlejret dokument

  2. MongoDB Index på forskellige typer

  3. Redis pubsub beskedkø, men med tilbagekald, som i ZeroMQ

  4. Hvad er den mest tidseffektive måde at serialisere/deserialisere en datatabel til/fra Redis?