В MongoDB, $avg
Операторът на конвейера за агрегиране изчислява и връща средната стойност на посочените числови стойности.
Синтаксис
$avg
операторът поддържа два синтаксиса.
Синтаксис 1:
{ $avg: <expression> }
Синтаксис 2:
{ $avg: [ <expression1>, <expression2> ... ] }
Първият синтаксис приема един аргумент, а вторият синтаксис приема множество аргументи.
Когато се използва в $group
етап, можете да използвате само първия синтаксис. В този случай $avg
връща колективната средна стойност на всички числови стойности, които са резултат от прилагането на определен израз към всеки документ в група документи, които споделят една и съща група по ключ.
Примери за синтаксис 1 (единичен аргумент)
Ето няколко примера, които използват синтаксис 1.
Групирани документи
Този пример използва $avg
във връзка с $group
за да върнете средната стойност за група документи, които са групирани по ключ.
Да предположим, че имаме колекция, наречена pets
със следните документи:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :3, "име" :"Мяу", "тип" :"Котка", "тегло" :7 }{ "_id" :4, "име" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Kenguroo", "weight" :100 }{ " _id" :6, "name" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Kenguroo", "weight" :200 }{ "_id" :8, "name" :"Snap", "type" :"Cat", "weight" :12 }{ "_id" :9, "name" :"Ruff", "тип" :"Куче", "тегло" :30 }
Можем да групираме тези документи по техния type
поле и след това използвайте $avg
за да върнете средното тегло на всяка група:
db.pets.aggregate(
[
{
$group:
{
_id: "$type",
average_weight: { $avg: "$weight" }
}
}
]
)
Резултат:
{ "_id" :"Куче", "средно_тегло" :20 }{ "_id" :"Котка", "средно_тегло" :9 }{ "_id" :"Кенгуру", "средно_тегло" :143.3333333333333334 предварително>Масиви
Този пример се прилага
$avg
към един документ, който съдържа поле с масив от стойности.Тази опция е налична само при използване на синтаксис на единичен аргумент. Масивите се игнорират, когато се използва синтаксисът с няколко аргумента (повече за това по-долу).
Да предположим, че имаме колекция, наречена
players
със следните документи:{ "_id" :1, "player" :"Homer", "резултати" :[ 1, 7, 2, 3, 8, 7, 1 ] }{ "_id" :2, "player" :" Мардж", "резултати" :[ 0, 1, 8, 17, 18, 8 ] }{ "_id" :3, "играч" :"Барт", "резултати" :[ 15, 11, 8, 0, 1 , 3 ] }{ "_id" :4, "player" :"Brian", "резултати" :[ 7 ] }{ "_id" :5, "player" :"Farnsworth", "резултати" :[ ] }{ "_id" :6, "player" :"Мег", "резултати" :null }{ "_id" :7, "player" :"Рон" }Можем да приложим
$avg
къмscores
поле във всеки документ:db.players.aggregate( [ { $project: { player: 1, averageScore: { $avg: "$scores" } } } ] )
Резултат:
{ "_id" :1, "player" :"Homer", "averageScore" :4.142857142857143 }{ "_id" :2, "player" :"Marge", "averageScore" :8.666666666666666" 3, "player" :"Bart", "averageScore" :6.333333333333333 }{ "_id" :4, "player" :"Brian", "averageScore" :7 }{ "_id" :5, "player" :"Farnsworth ", "averageScore" :null }{ "_id" :6, "player" :"Meg", "averageScore" :null }{ "_id" :7, "player" :"Ron", "averageScore" :null }В този случай първите четири документа върнаха средната стойност на различните числа, които бяха в съответните им масиви.
В случай на документ 4 това беше същото като числото, защото имаше само едно число в масива.
Документ 5 върна
null
защото предоставихме празен масив.Документ 6 върна
null
защото предоставихмеnull
като аргумент.Документ 7 върна
null
защото полето дори не е съществувало.Пример за синтаксис 2 (множество аргументи)
Вторият синтаксис включва предоставяне на
$avg
с повече от един аргумент.$avg
след това изчислява средната стойност въз основа на всички предоставени аргументи.Да предположим, че имаме колекция, наречена
data
със следните документи:{ "_id" :1, "a" :1, "b" :2, "c" :3, "d" :4 }{ "_id" :2, "a" :1, "b" :2, "c" :3, "d" :[ 4 ] }{ "_id" :3, "a" :1, "b" :2, "c" :3, "d" :"Хей" } { "_id" :4, "a" :"Едно", "b" :"Две", "c" :"Три", "d" :"Четири" }Можем да използваме
$avg
за да върне средната стойност наa
,b
,c
иd
полета на всеки документ:db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d" ] } } } ] )
Резултат:
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }Документ 1 връща средната стойност на входните стойности на
1
,2
,3
и4
.Следващите два документа обаче върнаха само средната стойност на входните стойности на
1
,2
и3
.$avg
операторът игнорира технияd
полета.Това е така, защото
$avg
игнорира нечислови стойности. Така че в този случай той игнорира"Hey"
в документ 3 и изчисли средната стойност от останалите (числови) полета.Що се отнася до документ 2, неговият
d
полето съдържа масив. Както споменахме,$avg
операторът игнорира масиви, когато използва синтаксис с няколко аргумента. По-точно, той третира масивите като нечислови стойности, когато се използва в този контекст, и$avg
игнорира нечислови стойности.Ако всички стойности не са числови, тогава
$avg
връщаnull
. Можем да видим това с документ 4.Липсващи полета
Когато използвате синтаксиса с няколко аргумента,
$avg
игнорира всички липсващи полета. Тоест, ако предоставите поле, което не съществува, то го игнорира. Ако нито едно от полетата не съществува, то връщаnull
.Пример:
db.data.aggregate( [ { $project: { avg: { $avg: [ "$a", "$b", "$c", "$d", "$e" ] } } } ] )
Резултат:
{ "_id" :1, "avg" :2.5 }{ "_id" :2, "avg" :2 }{ "_id" :3, "avg" :2 }{ "_id" :4, " avg" :null }В този случай предоставих допълнително поле (
$e
), което не съществува в документите.$avg
изчисли средната стойност въз основа на останалите полета, които правят съществуват.Но ето какво се случва, когато няма от полетата съществуват:
db.data.aggregate( [ { $project: { result: { $avg: [ "$x", "$y", "$z" ] } } } ] )
Резултат:
{ "_id" :1, "резултат" :null }{ "_id" :2, "резултат" :нулев }{ "_id" :3, "резултат" :нулев }{ "_id" :4, " резултат" :null }Резултатът е
null
за всички документи.Както видяхме по-рано, когато се използва синтаксисът с един аргумент, липсващо поле води до
null
.Пример:
db.pets.aggregate( [ { $group: { _id: "$type", avg: { $avg: "$oops!" } } } ] )
Резултат:
{ "_id" :"Кенгуру", "avg" :null }{ "_id" :"Котка", "avg" :null }{ "_id" :"Куче", "avg" :null }предварително>Налични етапи
$avg
е наличен в следните етапи:
$group
$project
$addFields
$set
$replaceRoot
$replaceWith
$match
етап, който включва$expr
израз