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
tillscores
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ållitnull
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åna
,b
,c
ochd
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 detnull
.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
av2
, siffror är mindre än matriser, så talet1
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