V MongoDB, $min
operátor agregačního kanálu vrací minimální hodnotu z výrazu.
Syntaxe
$min
operátor podporuje dvě syntaxe.
Syntaxe 1:
{ $min: <expression> }
Syntaxe 2:
{ $min: [ <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ě $min
vrátí minimá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á $min
ve spojení s $group
vrátit minimá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 $min
vrátí minimální hodnotu weight
pole pro každou skupinu:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
min: { $min: "$weight" }
}
}
]
)
Výsledek:
{ "_id" :"Klokánek", "min" :100 }{ "_id" :"Pes", "min" :10 }{ "_id" :"Kočka", "min" :7 }Pole
Tento příklad platí
$min
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
$min
doscores
pole v každém dokumentu:db.players.aggregate( [ { $project: { player: 1, min: { $min: "$scores" } } } ] )
Výsledek:
{ "_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 }V tomto případě první čtyři dokumenty vrátily minimá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 poskytlinull
jako argument.Dokument 7 vrátil
null
protože pole ani neexistovalo.Příklad syntaxe 2 (více argumentů)
Druhá syntaxe zahrnuje poskytnutí
$min
s více než jedním argumentem.$min
pak vrátí minimá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
$min
vrátí minimální hodnotu za
,b
,c
ad
pole:db.data.aggregate( [ { $match: { _id: { $in: [ 1 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Výsledek:
{ "_id" :1, "min" :-900 }V tomto případě
-900
byla minimální hodnota.Chybějící pole
Při použití víceargumentové syntaxe
$min
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: { min: { $min: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Výsledek:
{ "_id" :1, "min" :-900 }V tomto případě jsem poskytl další pole (
$e
), který v dokumentu neexistuje.$min
vypočítal minimá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: { $min: [ "$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", min: { $min: "$oops!" } } } ] )
Výsledek:
{ "_id" :"Pes", "min" :null }{ "_id" :"Kočka", "min" :null }{ "_id" :"Klokánek", "min" :null }Porovnání různých typů
$min
operátor porovnává hodnotu i typ. Pokud jsou hodnoty různého typu,$min
vypočítá minimá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" :[ 0 ] }{ "_id" :3, "a" :1, " b" :2, "c" :3, "d" :"0" }{ "_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
$min
k těm dokumentům:db.data.aggregate( [ { $match: { _id: { $in: [ 2, 3, 4, 5, 6 ] } } }, { $project: { min: { $min: [ "$a", "$b", "$c", "$d" ] } } } ] )
Výsledek:
{ "_id" :2, "min" :1 }{ "_id" :3, "min" :1 }{ "_id" :4, "min" :"čtyři" }{ "_id" :5 , "min" :ISODate("1999-01-03T23:30:15.100Z") }{ "_id" :6, "min" :"2000-01-03T23:30:15.100Z" }Pokud jde o dokument s
_id
z2
, čísla jsou menší než pole, takže číslo1
je vráceno (i když pole obsahuje číslo, které je menší než všechna ostatní čísla).Dokument 3:Čísla jsou menší než řetězce, takže je vráceno nejnižší číslo.
Dokument 4:Všechna pole jsou řetězce, a tak
Four
je minimální řetězec.Dokument 5:Jsou dodána dvě data, takže se vrátí dřívější datum.
Dokument 6:V tomto případě je dodán objekt Date a řetězec data. Řetězce jsou menší než objekty Date, a proto je vrácen řetězec (i když je jeho datum pozdější než datum objektu Date).
Dostupné fáze
$min
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