sql >> Database >  >> NoSQL >> MongoDB

MongoDB $pow

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 }

  1. Fout:het update-bewerkingsdocument moet atomaire operatoren bevatten bij het uitvoeren van updateOne

  2. Atomiciteit, isolatie en gelijktijdigheid in MongoDB

  3. Krijg een lijst met indexen in MongoDB

  4. Kan mongodb worden gebruikt als een ingesloten database?