MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $trunc

Dans MongoDB, le $trunc l'opérateur de pipeline d'agrégation tronque un nombre à un entier entier ou à une décimale spécifiée.

Vous avez la possibilité de spécifier le nombre de décimales pour lesquelles tronquer le nombre. Pour ce faire, passez un deuxième argument. Le premier argument est le nombre à tronquer et le deuxième argument (facultatif) est le nombre de décimales à tronquer.

L'omission du deuxième argument tronque tous les chiffres à droite de la décimale et renvoie la valeur entière entière.

Exemple

Supposons que nous ayons une collection appelée test avec les documents suivants :

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

Nous pouvons utiliser le $trunc opérateur pour tronquer les valeurs dans les data champ :

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

Résultat :

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

Notez que $trunc n'arrondit pas les nombres comme $round Est-ce que. Le $trunc l'opérateur tronque simplement le nombre. Si nous avions appliqué $round à cette collection, les premier et quatrième documents auraient été arrondis à 9 et -9 respectivement.

Spécifiez une décimale

Nous avons la possibilité d'utiliser un deuxième argument pour spécifier le nombre de décimales auquel tronquer le nombre.

Exemple :

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

Résultat :

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

Encore une fois, cela tronque simplement le nombre. Si nous avions utilisé $round , il aurait arrondi certains de ces nombres.

Décimales négatives

Le deuxième argument peut être n'importe quelle expression valide qui se résout en un entier compris entre -20 et 100, exclusif. Par conséquent, vous pouvez spécifier une décimale négative.

Lorsque vous faites cela, le nombre est tronqué à gauche de la décimale. Si la valeur absolue de l'entier négatif est supérieure au nombre de chiffres à gauche de la décimale, le résultat est 0 .

Supposons que nous ajoutions les documents suivants à notre collection :

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

Voici un exemple d'utilisation de plusieurs décimales négatives lors de l'application de $trunc à ces documents :

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

Résultat :

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

Décimale du zéro

Lorsque vous fournissez une décimale de 0 , le $trunc L'opérateur tronque tous les chiffres à droite de la décimale et renvoie la valeur entière entière.

Exemple :

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

Résultat :

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

Types de nombres

Le nombre à tronquer peut être n'importe quelle expression valide qui se résout en entier, double, décimal ou long. La valeur de retour correspond au type de données de la valeur d'entrée.

Donc, si nous ajoutons les documents suivants à notre collection :

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

Nous pouvons appliquer $trunc aux data champ :

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

Résultat :

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

Tronquer à des décimales nulles

Si le deuxième argument est null , le résultat est null .

Exemple :

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

Résultat :

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

Tronquer une valeur nulle

Si la valeur à tronquer est null , le résultat est null .

Supposons que nous ajoutions le document suivant à la collection :

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

Et nous utilisons $trunc pour tronquer la valeur nulle :

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

Résultat :

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

Tronquer l'infini

Si le nombre à tronquer est Infinity , le résultat est Infinity . De même, si c'est -Infinity , le résultat est -Infinity .

Ajoutons deux documents avec de telles valeurs :

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

Et tronquons-les :

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

Résultat :

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

Tronquer NaN

Tronquer NaN résultats en NaN .

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

Résultat :

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

Types non numériques

Si vous essayez de tronquer une valeur dont le type de données est incorrect (c'est-à-dire qu'il ne s'agit pas d'un nombre entier, double, décimal ou long), une erreur est renvoyée.

Supposons que nous ajoutions le document suivant à notre collection :

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

Et maintenant, nous essayons de tronquer les data champ :

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

Résultat :

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