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

MongoDB $pow

Dans MongoDB, le $pow l'opérateur de pipeline d'agrégation élève un nombre à l'exposant spécifié et renvoie le résultat

$pow accepte deux expressions, fournies dans un tableau. Le premier est le nombre et le second est l'exposant. Les deux peuvent être n'importe quelle expression valide, tant qu'elles se résolvent en un nombre.

Exemple

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

{ "_id" : 1, "data" : 10 }
{ "_id" : 2, "data" : -3 }
{ "_id" : 3, "data" : 0 }
{ "_id" : 4, "data" : null }

Nous pouvons utiliser le $pow opérateur pour élever les data champ par un exposant spécifié :

db.test.aggregate(
  [
    { $project: { 
        _id: 0,
        result: { $pow: [ "$data", 3 ] }
      }
    }
  ]
)

Résultat :

{ "result" : 1000 }
{ "result" : -27 }
{ "result" : 0 }
{ "result" : null }

Dans ce cas, j'ai utilisé les data champ comme nombre, et 3 comme exposant. Par conséquent, chaque document avait ses data champ élevé par la puissance 3.

Nous pouvons voir que null les valeurs renvoient null .

Le résultat est généralement du même type que l'entrée. Cependant, il existe des exceptions à cette règle. Plus précisément :

  • Un entier 32 bits sera converti en un entier 64 bits si le résultat est représentable sous la forme d'un entier 64 bits.
  • Un entier 32 bits sera converti en un double si le résultat n'est pas représentable sous la forme d'un entier 64 bits.
  • Un entier 64 bits sera converti en double si le résultat n'est pas représentable sous la forme d'un entier 64 bits.

Exposant négatif

Vous ne pouvez pas augmenter zéro (0 ) à un exposant négatif.

Exemple :

db.test.aggregate(
  [
    { $match: { _id: 3 } },
    { $project: { 
        _id: 0,
        result: { $pow: [ "$data", -3 ] }
      }
    }
  ]
)

Résultat :

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$pow cannot take a base of 0 and a negative exponent",
	"code" : 28764,
	"codeName" : "Location28764"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

L'erreur indique explicitement que "$pow ne peut pas prendre une base de 0 et un exposant négatif ".

Cependant, si nous excluons le document 3, nous n'obtenons plus l'erreur :

db.test.aggregate(
  [
    { $match: { _id: { $nin: [ 3 ] } } },
    { $project: { 
        result: { $pow: [ "$data", -3 ] }
      }
    }
  ]
)

Résultat :

{ "_id" : 1, "result" : 0.001 }
{ "_id" : 2, "result" : -0.037037037037037035 }
{ "_id" : 4, "result" : null }

Valeurs NaN

Si l'argument se résout en NaN , $pow renvoie NaN .

Exemple :

db.test.aggregate(
  [
    { $project: { 
        _id: 0,
        result: { $pow: [ "$data" * 1, 3 ] }
      }
    }
  ]
)

Résultat :

{ "result" : NaN }
{ "result" : NaN }
{ "result" : NaN }
{ "result" : NaN }

Champs inexistants

Si le $pow l'opérateur est appliqué sur un champ qui n'existe pas, null est renvoyé.

Exemple :

db.test.aggregate(
  [
    { $project: { 
        _id: 0,
        result: { $pow: [ "$beer", 3 ] }
      }
    }
  ]
)

Résultat :

{ "result" : null }
{ "result" : null }
{ "result" : null }
{ "result" : null }

Exposant nul

Nous avons déjà vu qu'un null la valeur renvoie null . Ceci est également vrai lorsque vous fournissez null comme exposant.

Exemple :

db.test.aggregate(
  [
    { $project: { 
        _id: 0,
        result: { $pow: [ "$data", null ] }
      }
    }
  ]
)

Résultat :

{ "result" : null }
{ "result" : null }
{ "result" : null }
{ "result" : null }