MongoDB 4.4 въведе $last оператор на тръбопровод за агрегация.
Този оператор връща последния елемент в масив.
Пример
Да предположим, че имаме колекция, наречена players, със следните документи:
{ "_id" :1, "player" :"Homer", "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "player" :"Marge", "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "играч" :"Барт", "резултати" :[ 15, 11, 8 ] }
Можем да видим, че всеки документ има scores поле, което съдържа масив.
Можем да използваме $last за да върне последния елемент от всеки от тези масиви.
Пример:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
]) Резултат:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 } Можем да видим, че последният елемент от масива е върнат за всеки документ.
Това е еквивалентно на използването на $arrayElemAt оператор със стойност -1 :
db.players.aggregate([
{
$project: {
"firstScore": { $arrayElemAt: [ "$scores", -1 ] }
}
}
]) Празни масиви
Ако предоставите празен масив, $last няма да върне стойност.
Да предположим, че вмъкваме следния документ в нашата колекция:
{ "_id" :4, "player" :"Farnsworth", "резултати" :[ ] } Нека стартираме кода отново:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
]) Резултат:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }предварително>
В този случай документ 4 не върна никаква стойност за масива. Дори не върна името на полето.
Нулеви и липсващи стойности
Ако операндът е нулев или липсва, $last връща null .
Да предположим, че вмъкваме следния документ:
{ "_id" :5, "player" :"Meg", "cores" :null }
Нека стартираме кода отново:
db.players.aggregate([
{
$project: {
"lastScore": {
$last: "$scores"
}
}
}
])
Резултат:
{ "_id" :1, "lastScore" :3 }{ "_id" :2, "lastScore" :18 }{ "_id" :3, "lastScore" :8 }{ "_id" :4 }{ "_id" :5, "lastScore" :нула }
Този път върна полето със стойност null .
Невалиден операнд
Операндът за $last трябва да се разреши до масив, нула или липсва. Предоставянето на невалиден операнд води до грешка.
За да демонстрираме това, нека се опитаме да използваме $last срещу player поле (което не е масив):
db.players.aggregate([
{
$project: {
"lastPlayer": {
$last: "$player"
}
}
}
])
Резултат:
Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"Аргументът на $last трябва да е масив, но е низ", "код" :28689, "codeName" :"Location28689"} :неуспешен агрегат :example@sqldat.com/mongo/shell/utils.js:25:13example@sqldat.com/mongo/shell/assert.js:18:14example@sqldat.com/mongo/shell/assert.js:618:17example @sqldat.com/mongo/shell/assert.js:708:16example@sqldat.com/mongo/shell/db.js:266:5example@sqldat.com/mongo/shell/collection.js:1046:12@( черупка):1:1
Както се очакваше, той върна грешка.