sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $max Aggregation Pipeline Operator

I MongoDB, $max aggregeringspipeline-operatorn returnerar det maximala värdet från ett uttryck.

Syntax

$max operatorn stöder två syntaxer.

Syntax 1:

{ $max: <expression> } 

Syntax 2:

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

Den första syntaxen accepterar ett argument och den andra syntaxen accepterar flera argument.

När den används i $group steg kan du bara använda den första syntaxen. I det här fallet, $max returnerar det maximala värdet som blir resultatet av att tillämpa ett uttryck på varje dokument i en grupp av dokument som delar samma grupp efter nyckel.

Exempel på syntax 1 (enkelt argument)

Här är ett par exempel som använder syntaxen för enstaka argument.

Grupperade dokument

Det här exemplet använder $max i samband med $group för att returnera det maximala värdet från en grupp av dokument som är grupperade efter nyckel.

Anta att vi har en samling som heter pets med följande dokument:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :4, "namn" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Känguru", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Känguru", "vikt" :130 }{ "_id" :7, "name" :"Punch", "type" :"Känguru", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "type" :"Hund", "vikt" :30 }

Vi kan gruppera dessa dokument efter deras type och använd sedan $max för att returnera maxvärdet för weight fält för varje grupp:

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

Resultat:

{ "_id" :"Känguru", "max" :200 }{ "_id" :"Katt", "max" :12 }{ "_id" :"Hund", "max" :30 } 

Arrayer

Det här exemplet gäller $max till ett enda dokument som innehåller ett fält med en rad värden.

Det här alternativet är endast tillgängligt när du använder syntaxen för enstaka argument. Matriser ignoreras när man använder flerargumentsyntaxen (mer om detta nedan).

Anta att vi har en samling som heter players med följande dokument:

{ "_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" }

Vi kan tillämpa $max till scores fält i varje dokument:

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

Resultat:

{ "_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 } 

I det här fallet returnerade de första fyra dokumenten det maximala värdet från de olika siffrorna som fanns i sina respektive arrayer.

I dokument 4:s fall var detta detsamma som numret, eftersom det bara fanns ett nummer i arrayen.

Dokument 5 returnerade null eftersom vi tillhandahållit en tom array.

Dokument 6 returnerade null eftersom vi tillhandahållit null som argument.

Dokument 7 returnerade null eftersom fältet inte ens existerade.

Exempel på syntax 2 (flera argument)

Den andra syntaxen innebär att du tillhandahåller $max med mer än ett argument. $max returnerar sedan det maximala värdet från alla angivna argument.

Anta att vi har en samling som heter data med följande dokument:

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

Vi kan använda $max för att returnera det maximala värdet från a , b , c och d fält:

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

Resultat:

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

I det här fallet, 500 var maxvärdet.

Fält saknas

När du använder syntaxen för flera argument, $max ignorerar eventuella saknade fält. Det vill säga, om du anger ett fält som inte finns ignorerar det det. Om inget av fälten finns returnerar det null .

Exempel:

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

Resultat:

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

I det här fallet angav jag ett extra fält ($e ) som inte finns i dokumentet. $max beräknade det maximala värdet baserat på de återstående fälten som gör finns.

Men här är vad som händer när ingen av fälten finns:

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

Resultat:

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

Resultatet är null .

Som vi såg tidigare, när man använder syntaxen med ett argument, resulterar ett saknat fält i null .

Exempel:

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

Resultat:

{ "_id" :"Hund", "max" :null }{ "_id" :"Känguru", "max" :null }{ "_id" :"Katt", "max" :null } 

Jämföra olika typer

$max operatör jämför både värde och typ. När värdena är av olika typer, $max beräknar det maximala värdet baserat på BSON-jämförelseordningen.

Anta att vår samling innehåller följande dokument:

{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 1 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"1" }{ "_id" :4, "a" :"En", "b" :"Två", "c" :"Tre", "d" :"Fyra" }{ "_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"}

Med undantag för dokument 4 använder vart och ett av dessa dokument blandade typer (det finns minst en typ som skiljer sig från de andra över datafält). Dokument 4 använder strängar i alla fyra fälten.

Det här är vad som händer när vi tillämpar $max till dessa dokument:

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

Resultat:

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

dokumentet med ett _id av 2 , matriser är större än siffror, så matrisen returneras (även om dess element är ett tal som är mindre än några av de andra talen).

Dokument 3:Strängar är större än siffror, så strängen returneras.

Dokument 4:Alla fält är strängar, och så Two är den största strängen.

Dokument 5:Två datum tillhandahålls, så det senare datumet returneras.

Dokument 6:I detta fall tillhandahålls ett Date-objekt och en datumsträng. Datumobjekt är större än strängar, så Date-objektet returneras (även om dess datum är tidigare än strängens).

Tillgängliga steg

$max är tillgänglig i följande steg:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match steg som inkluderar en $expr uttryck

  1. Användning av ServiceStack.Redis.Sentinel

  2. mongodb $in limit

  3. Hur man installerar och konfigurerar MongoDB på Ubuntu

  4. Spåra MongoDB minnesanvändning