I MongoDB, $pow
aggregeringspipeline-operatör höjer ett nummer till den angivna exponenten och returnerar resultatet
$pow
accepterar två uttryck, som tillhandahålls i en array. Den första är talet och den andra är exponenten. Båda kan vara vilket giltigt uttryck som helst, så länge de löser sig till ett tal.
Exempel
Anta att vi har en samling som heter test
med följande dokument:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
Vi kan använda $pow
operatör för att öka data
fält av en specificerad exponent:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Resultat:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
I det här fallet använde jag data
fältet som nummer och 3
som exponent. Därför hade varje dokument sina data
fält höjt med makten 3.
Vi kan se att null
värden returnerar null
.
Resultatet är vanligtvis samma typ som ingången. Det finns dock undantag från denna regel. Närmare bestämt:
- Ett 32-bitars heltal kommer att konverteras till ett 64-bitars heltal om resultatet kan representeras som ett 64-bitars heltal.
- Ett 32-bitars heltal kommer att konverteras till ett dubbelt om resultatet inte kan representeras som ett 64-bitars heltal.
- Ett 64-bitars heltal konverteras till dubbelt om resultatet inte kan representeras som ett 64-bitars heltal.
Negativ exponent
Du kan inte höja noll (0
) till en negativ exponent.
Exempel:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Resultat:
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
Felet säger uttryckligen att "$pow kan inte ta basen 0 och en negativ exponent ".
Men om vi exkluderar dokument 3 får vi inte längre felet:
db.test.aggregate(
[
{ $match: { _id: { $nin: [ 3 ] } } },
{ $project: {
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Resultat:
{ "_id" : 1, "result" : 0.001 } { "_id" : 2, "result" : -0.037037037037037035 } { "_id" : 4, "result" : null }
NaN-värden
Om argumentet löser sig till NaN
, $pow
returnerar NaN
.
Exempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Resultat:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Icke-existerande fält
Om $pow
operatorn tillämpas mot ett fält som inte finns, null
returneras.
Exempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Resultat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Nullexponent
Vi har redan sett att en null
värde returnerar null
. Detta gäller även när du tillhandahåller null
som exponent.
Exempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Resultat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }