sql >> Database >  >> NoSQL >> MongoDB

MongoDB $max Aggregation Pipeline Operator

In MongoDB is de $max aggregatiepijplijnoperator retourneert de maximale waarde van een uitdrukking.

Syntaxis

De $max operator ondersteunt twee syntaxis.

Syntaxis 1:

{ $max: <expression> }

Syntaxis 2:

{ $max: [ <expression1>, <expression2> ... ]  }

De eerste syntaxis accepteert één argument en de tweede syntaxis accepteert meerdere argumenten.

Bij gebruik in de $group stadium, kunt u alleen de eerste syntaxis gebruiken. In dit geval $max geeft de maximale waarde terug die het resultaat is van het toepassen van een uitdrukking op elk document in een groep documenten die dezelfde groep op sleutel delen.

Voorbeelden van syntaxis 1 (enkel argument)

Hier zijn een paar voorbeelden die de syntaxis van één argument gebruiken.

Gegroepeerde documenten

Dit voorbeeld gebruikt $max in combinatie met $group om de maximale waarde terug te geven van een groep documenten die op sleutel zijn gegroepeerd.

Stel dat we een verzameling hebben met de naam pets met de volgende documenten:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Kangaroo", "weight" : 100 }
{ "_id" : 6, "name" : "Hop", "type" : "Kangaroo", "weight" : 130 }
{ "_id" : 7, "name" : "Punch", "type" : "Kangaroo", "weight" : 200 }
{ "_id" : 8, "name" : "Snap", "type" : "Cat", "weight" : 12 }
{ "_id" : 9, "name" : "Ruff", "type" : "Dog", "weight" : 30 }

We kunnen deze documenten groeperen op hun type veld, en gebruik dan $max om de maximale waarde van het weight terug te geven veld voor elke groep:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            max: { $max: "$weight" }
          }
     }
   ]
)

Resultaat:

{ "_id" : "Kangaroo", "max" : 200 }
{ "_id" : "Cat", "max" : 12 }
{ "_id" : "Dog", "max" : 30 }

Arrays

Dit voorbeeld is van toepassing op $max naar een enkel document dat een veld met een reeks waarden bevat.

Deze optie is alleen beschikbaar bij gebruik van de syntaxis voor één argument. Arrays worden genegeerd bij gebruik van de syntaxis met meerdere argumenten (meer hierover hieronder).

Stel dat we een verzameling hebben met de naam players met de volgende documenten:

{ "_id" : 1, "player" : "Homer", "scores" : [ 1, 7, 2, 3, 8, 7, 1 ] }
{ "_id" : 2, "player" : "Marge", "scores" : [ 0, 1, 8, 17, 18, 8 ] }
{ "_id" : 3, "player" : "Bart", "scores" : [ 15, 11, 8, 0, 1, 3 ] }
{ "_id" : 4, "player" : "Brian", "scores" : [ 7 ] }
{ "_id" : 5, "player" : "Farnsworth", "scores" : [ ] }
{ "_id" : 6, "player" : "Meg", "scores" : null }
{ "_id" : 7, "player" : "Ron" }

We kunnen $max apply toepassen naar de scores veld in elk document:

db.players.aggregate(
   [
     {
       $project:
          {
            player: 1,
            max: { $max: "$scores" }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "player" : "Homer", "max" : 8 }
{ "_id" : 2, "player" : "Marge", "max" : 18 }
{ "_id" : 3, "player" : "Bart", "max" : 15 }
{ "_id" : 4, "player" : "Brian", "max" : 7 }
{ "_id" : 5, "player" : "Farnsworth", "max" : null }
{ "_id" : 6, "player" : "Meg", "max" : null }
{ "_id" : 7, "player" : "Ron", "max" : null }

In dit geval gaven de eerste vier documenten de maximale waarde terug van de verschillende getallen die in hun respectievelijke arrays stonden.

In het geval van document 4 was dit hetzelfde als het nummer, omdat er maar één nummer in de array was.

Document 5 retourneerde null omdat we een lege array hebben opgegeven.

Document 6 retourneerde null omdat we null . hebben opgegeven als het argument.

Document 7 retourneerde null omdat het veld niet eens bestond.

Voorbeeld van syntaxis 2 (meerdere argumenten)

De tweede syntaxis omvat het verstrekken van $max met meer dan één argument. $max retourneert vervolgens de maximale waarde van alle opgegeven argumenten.

Stel dat we een verzameling hebben met de naam data met het volgende document:

{ "_id" : 1, "a" : 10, "b" : 500, "c" : -900, "d" : 4 }

We kunnen $max . gebruiken om de maximale waarde terug te geven van de a , b , c , en d velden:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "max" : 500 }

In dit geval 500 was de maximale waarde.

Ontbrekende velden

Bij gebruik van de syntaxis met meerdere argumenten, $max negeert eventuele ontbrekende velden. Dat wil zeggen, als u een veld opgeeft dat niet bestaat, wordt dit genegeerd. Als geen van de velden bestaat, retourneert het null .

Voorbeeld:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "max" : 500 }

In dit geval heb ik een extra veld ($e ) die niet in het document voorkomt. $max berekende de maximale waarde op basis van de resterende velden die doen bestaan.

Dit is echter wat er gebeurt als geen van de velden bestaat:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            result: { $max: [ "$x", "$y", "$z" ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 1, "result" : null }

Het resultaat is null .

Zoals we eerder zagen, resulteert een ontbrekend veld bij gebruik van de syntaxis van één argument in null .

Voorbeeld:

db.pets.aggregate(
   [
     {
       $group:
          {
            _id: "$type",
            max: { $max: "$oops!" }
          }
     }
   ]
)

Resultaat:

{ "_id" : "Dog", "max" : null }
{ "_id" : "Kangaroo", "max" : null }
{ "_id" : "Cat", "max" : null }

Verschillende soorten vergelijken

De $max operator vergelijkt zowel waarde als type. Als de waarden van verschillende typen zijn, $max berekent de maximale waarde op basis van de BSON-vergelijkingsvolgorde.

Stel dat onze collectie de volgende documenten bevat:

{ "_id" : 2, "a" : 1, "b" : 2, "c" : 3, "d" : [ 1 ] }
{ "_id" : 3, "a" : 1, "b" : 2, "c" : 3, "d" : "1" }
{ "_id" : 4, "a" : "One", "b" : "Two", "c" : "Three", "d" : "Four" }
{
	"_id" : 5,
	"a" : ISODate("1999-01-03T23:30:15.100Z"),
	"b" : ISODate("2000-01-03T23:30:15.100Z")
}
{
	"_id" : 6,
	"a" : ISODate("1999-01-03T23:30:15.100Z"),
	"b" : "2000-01-03T23:30:15.100Z"
}

Met uitzondering van document 4, gebruikt elk van die documenten gemengde typen (er is ten minste één type dat verschilt van de andere in gegevensvelden). Document 4 gebruikt tekenreeksen in alle vier de velden.

Dit is wat er gebeurt als we $max toepassen naar die documenten:

db.data.aggregate(
   [
     { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } },
     {
       $project:
          {
            max: { $max: [ "$a", "$b", "$c", "$d" ] }
          }
     }
   ]
)

Resultaat:

{ "_id" : 2, "max" : [ 1 ] }
{ "_id" : 3, "max" : "1" }
{ "_id" : 4, "max" : "Two" }
{ "_id" : 5, "max" : ISODate("2000-01-03T23:30:15.100Z") }
{ "_id" : 6, "max" : ISODate("1999-01-03T23:30:15.100Z") }

het document met een _id van 2 , arrays zijn groter dan getallen, dus de array wordt geretourneerd (ook al is het element een getal dat kleiner is dan sommige van de andere getallen).

Document 3:Strings zijn groter dan getallen, en dus wordt de string geretourneerd.

Document 4:Alle velden zijn strings, dus Two is de grootste reeks.

Document 5:Er worden twee datums opgegeven, dus de latere datum wordt teruggegeven.

Document 6:In dit geval wordt een Date-object en een date-string aangeleverd. Date-objecten zijn groter dan strings, en dus wordt het Date-object geretourneerd (ook al is de datum eerder dan die van de string).

Beschikbare stadia

$max is beschikbaar in de volgende fasen:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match fase met een $expr uitdrukking

  1. Willekeurig record van MongoDB

  2. Een gids voor implementatie en onderhoud van MongoDB met behulp van Puppet:deel 1

  3. Standaard bestandsrechten wijzigen op redis dump

  4. Hoe maak je verbinding met mongodb met sailsjs v0.10?