In MongoDB ist der $pow
Der Aggregations-Pipeline-Operator erhöht eine Zahl auf den angegebenen Exponenten und gibt das Ergebnis zurück
$pow
akzeptiert zwei Ausdrücke, die in einem Array bereitgestellt werden. Der erste ist die Zahl und der zweite der Exponent. Beide können alle gültigen Ausdrücke sein, solange sie in eine Zahl aufgelöst werden.
Beispiel
Angenommen, wir haben eine Sammlung namens test
mit folgenden Dokumenten:
{ "_id" : 1, "data" : 10 } { "_id" : 2, "data" : -3 } { "_id" : 3, "data" : 0 } { "_id" : 4, "data" : null }
Wir können den $pow
verwenden -Operator, um die data
zu erheben Feld durch einen angegebenen Exponenten:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", 3 ] }
}
}
]
)
Ergebnis:
{ "result" : 1000 } { "result" : -27 } { "result" : 0 } { "result" : null }
In diesem Fall habe ich die data
verwendet Feld als Zahl und 3
als Exponent. Daher hatte jedes Dokument seine data
Feld erhöht durch die Potenz von 3.
Wir können diesen null
sehen Werte geben null
zurück .
Das Ergebnis ist normalerweise vom gleichen Typ wie die Eingabe. Es gibt jedoch Ausnahmen von dieser Regel. Konkret:
- Eine 32-Bit-Ganzzahl wird in eine 64-Bit-Ganzzahl konvertiert, wenn das Ergebnis als 64-Bit-Ganzzahl darstellbar ist.
- Eine 32-Bit-Ganzzahl wird in ein Double konvertiert, wenn das Ergebnis nicht als 64-Bit-Ganzzahl darstellbar ist.
- Eine 64-Bit-Ganzzahl wird in Double konvertiert, wenn das Ergebnis nicht als 64-Bit-Ganzzahl darstellbar ist.
Negativer Exponent
Null kann nicht erhöht werden (0
) zu einem negativen Exponenten.
Beispiel:
db.test.aggregate(
[
{ $match: { _id: 3 } },
{ $project: {
_id: 0,
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Ergebnis:
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
Der Fehler besagt ausdrücklich, dass „$pow keine Basis von 0 und einen negativen Exponenten annehmen kann “.
Wenn wir jedoch Dokument 3 ausschließen, erhalten wir nicht mehr den Fehler:
db.test.aggregate(
[
{ $match: { _id: { $nin: [ 3 ] } } },
{ $project: {
result: { $pow: [ "$data", -3 ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "result" : 0.001 } { "_id" : 2, "result" : -0.037037037037037035 } { "_id" : 4, "result" : null }
NaN-Werte
Wenn das Argument zu NaN
aufgelöst wird , $pow
gibt NaN
zurück .
Beispiel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data" * 1, 3 ] }
}
}
]
)
Ergebnis:
{ "result" : NaN } { "result" : NaN } { "result" : NaN } { "result" : NaN }
Nicht vorhandene Felder
Wenn der $pow
-Operator wird auf ein nicht vorhandenes Feld angewendet, null
zurückgegeben wird.
Beispiel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$beer", 3 ] }
}
}
]
)
Ergebnis:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }
Null-Exponent
Wir haben bereits gesehen, dass dies ein null
ist value gibt null
zurück . Dies gilt auch, wenn null
angegeben wird als Exponent.
Beispiel:
db.test.aggregate(
[
{ $project: {
_id: 0,
result: { $pow: [ "$data", null ] }
}
}
]
)
Ergebnis:
{ "result" : null } { "result" : null } { "result" : null } { "result" : null }