sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $min Aggregation Pipeline Operator

I MongoDB, $min aggregeringspipeline-operatorn returnerar minimivärdet från ett uttryck.

Syntax

$min operatorn stöder två syntaxer.

Syntax 1:

{ $min: <expression> } 

Syntax 2:

{ $min: [ <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, $min returnerar det lägsta värdet som blir resultatet av att använda 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 $min i samband med $group för att returnera minimivä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 $min för att returnera minimivärdet för weight fält för varje grupp:

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

Resultat:

{ "_id" :"Känguru", "min" :100 }{ "_id" :"Hund", "min" :10 }{ "_id" :"Katt", "min" :7 } 

Arrayer

Det här exemplet gäller $min 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 använda $min till scores fält i varje dokument:

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

Resultat:

{ "_id" :1, "player" :"Homer", "min" :1 }{ "_id" :2, "player" :"Marge", "min" :0 }{ "_id" :3, "player" :"Bart", "min" :0 }{ "_id" :4, "player" :"Brian", "min" :7 }{ "_id" :5, "player" :"Farnsworth ", "min" :null }{ "_id" :6, "player" :"Meg", "min" :null }{ "_id" :7, "player" :"Ron", "min" :null } 

I det här fallet returnerade de första fyra dokumenten minimivä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 $min med mer än ett argument. $min returnerar sedan minimivä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 $min för att returnera minimivärdet från a , b , c och d fält:

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

Resultat:

{ "_id" :1, "min" :-900 }

I det här fallet -900 var minimivärdet.

Fält saknas

När du använder syntaxen för flera argument, $min 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:
          {
            min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] }
          }
     }
   ]
) 

Resultat:

{ "_id" :1, "min" :-900 }

I det här fallet angav jag ett extra fält ($e ) som inte finns i dokumentet. $min beräknade minimivä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: { $min: [ "$x", "$y", "$z" ] }
          }
     }
   ]
) 

Resultat:

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

Resultatet är null .

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

Exempel:

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

Resultat:

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

Jämföra olika typer

$min operatör jämför både värde och typ. När värdena är av olika typer, $min beräknar minimivä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" :[ 0 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"0" }{ "_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 $min till dessa dokument:

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

Resultat:

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

Angående dokumentet med _id av 2 , siffror är mindre än matriser, så talet 1 returneras (även om arrayen innehåller ett tal som är mindre än alla andra siffror).

Dokument 3:Tal är mindre än strängar, så det lägsta talet returneras.

Dokument 4:Alla fält är strängar, och så Four är minimisträngen.

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

Dokument 6:I detta fall tillhandahålls ett Date-objekt och en datumsträng. Strängar är mindre än Date-objekt, och därför returneras strängen (även om dess datum är senare än Date-objektets).

Tillgängliga steg

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

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

  1. MongoDB jokertecken i nyckeln till en fråga

  2. Redis kommando för att få alla tillgängliga nycklar?

  3. 5 sätt att få protokollet från ett datum i MongoDB

  4. Hur kan jag se var mongoDB lagrar data? (det är inte standard /data/db!)