MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $pow

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 }