sql >> Database >  >> NoSQL >> MongoDB

MongoDB $trun

In MongoDB, de $trunc aggregatiepijplijnoperator kapt een getal af tot een geheel getal of een opgegeven decimaal.

U hebt de mogelijkheid om op te geven voor hoeveel decimalen het getal moet worden afgekapt. Om dit te doen, geef een tweede argument door. Het eerste argument is het getal dat moet worden afgekapt en het tweede (optionele) argument is het aantal decimalen waarop het moet worden afgekapt.

Als u het tweede argument weglaat, worden alle cijfers rechts van het decimaalteken afgekapt en wordt het gehele gehele getal geretourneerd.

Voorbeeld

Stel dat we een verzameling hebben met de naam test met de volgende documenten:

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

We kunnen de $trunc . gebruiken operator om de waarden in de data . af te kappen veld:

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

Resultaat:

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

Merk op dat $trunc rondt geen getallen af ​​zoals $round doet. De $trunc operator kapt het nummer gewoon af. Als we $round . hadden toegepast voor deze verzameling zouden het eerste en het vierde document zijn afgerond op 9 en -9 respectievelijk.

Geef een decimale plaats op

We hebben de mogelijkheid om een ​​tweede argument te gebruiken om aan te geven op hoeveel decimalen het getal moet worden afgekapt.

Voorbeeld:

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

Resultaat:

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

Nogmaals, dit kapt eenvoudig het nummer af. Als we $round . hadden gebruikt , zou het sommige van deze getallen hebben afgerond.

Negatieve decimalen

Het tweede argument kan elke geldige expressie zijn die wordt omgezet in een geheel getal tussen -20 en 100, exclusief. Daarom kunt u een negatieve decimale plaats opgeven.

Wanneer u dit doet, wordt het getal links van de komma afgekapt. Als de absolute waarde van het negatieve gehele getal groter is dan het aantal cijfers links van het decimaalteken, is het resultaat 0 .

Stel dat we de volgende documenten aan onze collectie toevoegen:

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

Hier is een voorbeeld van het gebruik van verschillende negatieve decimalen bij het toepassen van $trunc naar die documenten:

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

Resultaat:

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

Decimaal nul

Wanneer u een decimaal 0 . opgeeft , de $trunc operator kapt alle cijfers rechts van het decimaalteken af ​​en geeft het gehele gehele getal terug.

Voorbeeld:

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

Resultaat:

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

Nummertypen

Het af te kappen getal kan elke geldige uitdrukking zijn die wordt omgezet in een geheel getal, dubbel, decimaal of lang. De retourwaarde komt overeen met het gegevenstype van de invoerwaarde.

Dus als we de volgende documenten aan onze collectie toevoegen:

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

We kunnen $trunc . toepassen naar de data veld:

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

Resultaat:

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

Afkappen tot nul decimalen

Als het tweede argument null . is , het resultaat is null .

Voorbeeld:

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

Resultaat:

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

Een nulwaarde afkappen

Als de af te kappen waarde null . is , het resultaat is null .

Stel dat we het volgende document aan de collectie toevoegen:

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

En we gebruiken $trunc om de null-waarde af te kappen:

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

Resultaat:

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

Oneindigheid afkappen

Als het getal dat moet worden afgekapt Infinity is , het resultaat is Infinity . Evenzo, als het -Infinity . is , het resultaat is -Infinity .

Laten we twee documenten met dergelijke waarden toevoegen:

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

En laten we ze inkorten:

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

Resultaat:

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

NaN afkappen

Afkappen van NaN resulteert in NaN .

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

Resultaat:

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

Niet-numerieke typen

Als u een waarde probeert af te kappen die van het verkeerde gegevenstype is (d.w.z. het is geen geheel getal, dubbel, decimaal of lang), wordt een fout geretourneerd.

Stel dat we het volgende document aan onze collectie toevoegen:

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

En nu proberen we de data af te kappen veld:

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

Resultaat:

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. Een SQL LIKE-instructie gebruiken in MongoDB

  2. MongoDB bevraagt ​​meerdere collecties tegelijk

  3. Hoe krijg ik de nieuwe waarde terug na een update in een ingesloten array?

  4. MongoDB-databaseverbinding correct afsluiten vanuit C# 2.1-stuurprogramma?