sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $trunc

I MongoDB, $trunc aggregeringspipeline-operatör trunkerar ett tal till ett heltal eller till en angiven decimal.

Du har möjlighet att ange hur många decimaler som talet ska trunkeras för. För att göra detta, skicka ett andra argument. Det första argumentet är antalet som ska trunkeras, och det andra (valfria) argumentet är antalet decimaler som det ska trunkeras till.

Om det andra argumentet utelämnas trunkeras alla siffror till höger om decimalen och returnerar hela heltalsvärdet.

Exempel

Anta att vi har en samling som heter test med följande dokument:

{ "_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 använda $trunc operatorn för att trunkera värdena i data fält:

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 }

Lägg märke till att $trunc avrundar inte siffror som $round gör. $trunc operatör trunkerar helt enkelt numret. Om vi ​​hade tillämpat $round till denna samling skulle det första och fjärde dokumentet ha avrundats till 9 och -9 respektive.

Ange en decimal

Vi har möjlighet att använda ett andra argument för att ange hur många decimaler som talet ska trunkeras till.

Exempel:

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 }

Återigen, detta avkortar helt enkelt numret. Om vi ​​hade använt $round , det skulle ha avrundat några av dessa siffror.

Negativa decimaler

Det andra argumentet kan vara vilket giltigt uttryck som helst som löser sig till ett heltal mellan -20 och 100, exklusivt. Därför kan du ange en negativ decimal.

När du gör detta, trunkeras talet till vänster om decimalen. Om det absoluta värdet för det negativa heltal är större antalet siffror till vänster om decimalen, blir resultatet 0 .

Anta att vi lägger till följande dokument i vår samling:

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

Här är ett exempel på hur du använder olika negativa decimaler när du använder $trunc till dessa dokument:

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
}

Noll decimal

När du anger en decimal på 0 , $trunc operatorn trunkerar alla siffror till höger om decimalen och returnerar hela heltalsvärdet.

Exempel:

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 }

Nummertyper

Numret som ska trunkeras kan vara vilket giltigt uttryck som helst som löser sig till ett heltal, dubbelt, decimalt eller långt. Returvärdet matchar datatypen för inmatningsvärdet.

Så om vi lägger till följande dokument till vår samling:

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

Vi kan använda $trunc till data fält:

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

Trunkerar till nolldecimaler

Om det andra argumentet är null , resultatet är null .

Exempel:

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 }

Trunkera ett nollvärde

Om värdet som ska trunkeras är null , resultatet är null .

Anta att vi lägger till följande dokument i samlingen:

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

Och vi använder $trunc för att trunkera nullvärdet:

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

Resultat:

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

Truncating Infinity

Om numret som ska trunkeras är Infinity , resultatet är Infinity . Likaså om det är -Infinity , resultatet är -Infinity .

Låt oss lägga till två dokument med sådana värden:

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

Och låt oss trunkera 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 }

Trunkerar NaN

Trunkerar NaN resulterar 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 }

Icke-numeriska typer

Om du försöker trunkera ett värde som är fel datatyp (dvs. det är inte ett heltal, dubbelt, decimalt eller långt), returneras ett fel.

Anta att vi lägger till följande dokument i vår samling:

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

Och nu försöker vi trunkera data fält:

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. Få åtkomst till dockeriserade redis från Windows-värden

  2. Övervaka MongoDB-instanser med MongoDB Monitoring Service (MMS)

  3. Azure Redis cache - timeouts på GET-samtal

  4. Mongoose Unique index fungerar inte!