In MongoDB, de $pow
aggregatiepijplijnoperator verhoogt een getal naar de opgegeven exponent en retourneert het resultaat
$pow
accepteert twee expressies, geleverd in een array. De eerste is het getal en de tweede is de exponent. Beide kunnen elke geldige uitdrukking zijn, zolang ze maar worden omgezet in een getal.
Voorbeeld
Stel dat we een verzameling hebben met de naam test
met de volgende documenten:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
We kunnen de $pow
. gebruiken operator om de data
te verhogen veld door een gespecificeerde exponent:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Resultaat:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
In dit geval heb ik de data
. gebruikt veld als het nummer, en 3
als exponent. Daarom had elk document zijn data
veld verhoogd met de macht van 3.
We kunnen zien dat null
waarden retourneren null
.
Het resultaat is meestal van hetzelfde type als de invoer. Er zijn echter uitzonderingen op deze regel. Specifiek:
- Een 32-bits geheel getal wordt geconverteerd naar een 64-bits geheel getal als het resultaat kan worden weergegeven als een 64-bits geheel getal.
- Een 32-bits geheel getal wordt geconverteerd naar een double als het resultaat niet kan worden weergegeven als een 64-bits geheel getal.
- Een 64-bits geheel getal wordt geconverteerd naar dubbel als het resultaat niet kan worden weergegeven als een 64-bits geheel getal.
Negatieve exponent
Je kunt geen nul verhogen (0
) naar een negatieve exponent.
Voorbeeld:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Resultaat:
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
De fout geeft expliciet aan dat "$pow geen grondtal van 0 en een negatieve exponent kan aannemen ".
Als we document 3 echter uitsluiten, krijgen we niet langer de foutmelding:
db.test.aggregate(
[
{ $match: { _id: { $nin: [ 3 ] } } },
{ $project: {
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Resultaat:
{ "_id" : 1, "result" : 0.001 } { "_id" : 2, "result" : -0.037037037037037035 } { "_id" : 4, "result" : null }
NaN-waarden
Als het argument wordt omgezet in NaN
, $pow
retourneert NaN
.
Voorbeeld:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Resultaat:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Niet-bestaande velden
Als de $pow
operator wordt toegepast op een veld dat niet bestaat, null
wordt geretourneerd.
Voorbeeld:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Resultaat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Null-exponent
We hebben al gezien dat een null
waarde retourneert null
. Dit geldt ook bij het verstrekken van null
als de exponent.
Voorbeeld:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Resultaat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }