I MongoDB er $pow
aggregeringspipeline-operatør hæver et tal til den angivne eksponent og returnerer resultatet
$pow
accepterer to udtryk, der leveres i et array. Den første er tallet, og den anden er eksponenten. Begge kan være et hvilket som helst gyldigt udtryk, så længe de løses til et tal.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokumenter:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
Vi kan bruge $pow
operatør for at hæve data
felt af en specificeret eksponent:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Resultat:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
I dette tilfælde brugte jeg data
felt som nummer, og 3
som eksponent. Derfor havde hvert dokument sine data
felt hævet med 3 potens.
Vi kan se, at null
værdier returnerer null
.
Resultatet er normalt den samme type som inputtet. Der er dog undtagelser fra denne regel. Specifikt:
- Et 32-bit heltal vil blive konverteret til et 64-bit heltal, hvis resultatet kan repræsenteres som et 64-bit heltal.
- Et 32-bit heltal vil blive konverteret til et dobbelt, hvis resultatet ikke kan repræsenteres som et 64-bit heltal.
- Et 64-bit heltal vil blive konverteret til det dobbelte, hvis resultatet ikke kan repræsenteres som et 64-bit heltal.
Negativ eksponent
Du kan ikke hæve nul (0
) til en negativ eksponent.
Eksempel:
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
Fejlen siger eksplicit, at "$pow kan ikke tage en base på 0 og en negativ eksponent “.
Men hvis vi udelukker dokument 3, får vi ikke længere fejlen:
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ærdier
Hvis argumentet løses til NaN
, $pow
returnerer NaN
.
Eksempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Resultat:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Ikke-eksisterende felter
Hvis $pow
operator anvendes mod et felt, der ikke eksisterer, null
er returneret.
Eksempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Resultat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Nul-eksponent
Vi har allerede set, at en null
værdi returnerer null
. Dette gælder også, når du angiver null
som eksponent.
Eksempel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Resultat:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }