MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $last Оператор на конвейера за агрегация

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"} :неуспешен агрегат :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example @sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@( черупка):1:1

Както се очакваше, той върна грешка.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да създадете схема на мангуста динамично?

  2. Spring Data Mongo Repository::Общ споделен метод за всички проблеми с репо

  3. Атомарност, изолация и паралелност в MongoDB

  4. Променете типа на полето в агрегирането на mongoDB и използва ли $lookup индекс върху полета или не?

  5. Сравнение на дати в mongodb