sql >> Databáze >  >> NoSQL >> MongoDB

Operátor agregačního potrubí MongoDB $max

V MongoDB, $max Operátor agregačního kanálu vrací maximální hodnotu z výrazu.

Syntaxe

$max operátor podporuje dvě syntaxe.

Syntaxe 1:

{ $max: <expression> } 

Syntaxe 2:

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

První syntaxe přijímá jeden argument a druhá syntaxe přijímá více argumentů.

Při použití ve $group fázi, můžete použít pouze první syntaxi. V tomto případě $max vrátí maximální hodnotu, která je výsledkem použití výrazu na každý dokument ve skupině dokumentů, které sdílejí stejnou skupinu podle klíče.

Příklady syntaxe 1 (jediný argument)

Zde je několik příkladů, které používají syntaxi jediného argumentu.

Skupinové dokumenty

Tento příklad používá $max ve spojení s $group vrátit maximální hodnotu ze skupiny dokumentů, které jsou seskupeny podle klíče.

Předpokládejme, že máme sbírku nazvanou pets s následujícími dokumenty:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }{ "_id" :4, "jméno" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Klokánek", "váha" :100 }{ " _id" :6, "name" :"Hop", "type" :"Klokánek", "váha" :130 }{ "_id" :7, "name" :"Punch", "type" :"Klokánek", "váha" :200 }{ "_id" :8, "jméno" :"Snap", "type" :"Kočka", "váha" :12 }{ "_id" :9, "jméno" :"Ruff", "type" :"Pes", "hmotnost" :30 }

Tyto dokumenty můžeme seskupit podle jejich type a poté použijte $max vrátíte maximální hodnotu weight pole pro každou skupinu:

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

Výsledek:

{ "_id" :"Klokánek", "max" :200 }{ "_id" :"Kočka", "max" :12 }{ "_id" :"Pes", "max" :30 } 

Pole

Tento příklad platí $max do jednoho dokumentu, který obsahuje pole s polem hodnot.

Tato možnost je dostupná pouze při použití syntaxe jednoho argumentu. Při použití víceargumentové syntaxe jsou pole ignorována (více o tom níže).

Předpokládejme, že máme kolekci nazvanou players s následujícími dokumenty:

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

Můžeme použít $max do scores pole v každém dokumentu:

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

Výsledek:

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

V tomto případě první čtyři dokumenty vrátily maximální hodnotu z různých čísel, která byla v příslušných polích.

V případě dokumentu 4 to bylo stejné jako číslo, protože v poli bylo pouze jedno číslo.

Dokument 5 vrátil null protože jsme poskytli prázdné pole.

Dokument 6 vrátil null protože jsme poskytli null jako argument.

Dokument 7 vrátil null protože pole ani neexistovalo.

Příklad syntaxe 2 (více argumentů)

Druhá syntaxe zahrnuje poskytnutí $max s více než jedním argumentem. $max pak vrátí maximální hodnotu ze všech zadaných argumentů.

Předpokládejme, že máme kolekci nazvanou data s následujícím dokumentem:

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

Můžeme použít $max vrátíte maximální hodnotu z a , b , c a d pole:

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

Výsledek:

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

V tomto případě 500 byla maximální hodnota.

Chybějící pole

Při použití víceargumentové syntaxe $max ignoruje všechna chybějící pole. To znamená, že pokud zadáte pole, které neexistuje, bude je ignorovat. Pokud žádné z polí neexistuje, vrátí null .

Příklad:

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

Výsledek:

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

V tomto případě jsem poskytl další pole ($e ), který v dokumentu neexistuje. $max vypočítal maximální hodnotu na základě zbývajících polí, která dělají existovat.

Co se však stane, když žádné z polí existují:

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

Výsledek:

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

Výsledek je null .

Jak jsme viděli dříve, při použití syntaxe s jedním argumentem vede chybějící pole k null .

Příklad:

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

Výsledek:

{ "_id" :"Pes", "max" :null }{ "_id" :"Klokánek", "max" :null }{ "_id" :"Kočka", "max" :null } 

Porovnání různých typů

$max operátor porovnává hodnotu i typ. Pokud jsou hodnoty různých typů, $max vypočítá maximální hodnotu na základě pořadí porovnání BSON.

Předpokládejme, že naše sbírka obsahuje následující dokumenty:

{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 1 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"1" }{ "_id" :4, "a" :"Jedna", "b" :"Dva", "c" :"Tři", "d" :"Čtyři" }{ "_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"} 

S výjimkou dokumentu 4 používá každý z těchto dokumentů smíšené typy (existuje alespoň jeden typ, který se od ostatních liší napříč datovými poli). Dokument 4 používá řetězce ve všech čtyřech polích.

Zde je to, co se stane, když použijeme $max k těm dokumentům:

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

Výsledek:

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

dokument s _id z 2 , pole jsou větší než čísla, takže pole je vráceno (i když jeho prvkem je číslo, které je menší než některá jiná čísla).

Dokument 3:Řetězce jsou větší než čísla, a proto je vrácen řetězec.

Dokument 4:Všechna pole jsou řetězce, a tak Two je největší řetězec.

Dokument 5:Jsou dodána dvě data, takže se vrátí pozdější datum.

Dokument 6:V tomto případě je dodán objekt Date a řetězec data. Objekty Date jsou větší než řetězce, a proto je vrácen objekt Date (i když je jeho datum dřívější než datum řetězce).

Dostupné fáze

$max je k dispozici v následujících fázích:

  • $group
  • $project
  • $addFields
  • $set
  • $replaceRoot
  • $replaceWith
  • $match fázi, která obsahuje $expr výraz

  1. Jak zabránit vrácení zpět v MongoDB

  2. Odkaz na schéma Mongoose a nedefinovaný typ 'ObjectID'

  3. Vizualizace topologie vašeho clusteru v ClusterControl

  4. jak nakonfigurovat různé ttl pro každou mezipaměť redis při použití @cacheable ve springboot2.0