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 }