sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $pow

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 }

  1. Lagrar returvärdet för node.js setTimeout i redis

  2. Mongoose, Välj ett specifikt fält med hitta

  3. Formatera ett tal som en procentandel i SQL

  4. 2 Helm Charts med delat Redis-beroende