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

MongoDB $first Aggregation Pipeline Operator

MongoDB 4.4 въведе $first оператор на тръбопровод за агрегация.

Този оператор връща първия елемент в масива.

Пример

Да предположим, че имаме колекция, наречена players, със следните документи:

{ "_id" :1, "player" :"Homer", "резултати" :[ 1, 5, 3 ] }{ "_id" :2, "player" :"Marge", "резултати" :[ 8, 17, 18 ] }{ "_id" :3, "играч" :"Барт", "резултати" :[ 15, 11, 8 ] }

Можем да видим, че всеки документ има scores поле, което съдържа масив.

Можем да използваме $first за да върне първия елемент на всеки от тези масиви.

Пример:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Резултат:

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }

Можем да видим, че първият елемент от масива е върнат за всеки документ.

Това е еквивалентно на използването на $arrayElemAt оператор със стойност нула (0 ):

db.players.aggregate([
  {
    $project: {
      "firstScore": { $arrayElemAt: [ "$scores", 0 ] }
    }
  }
]) 

Празни масиви

Ако предоставите празен масив, $first няма да върне стойност.

Да предположим, че вмъкваме следния документ в нашата колекция:

{ "_id" :4, "player" :"Farnsworth", "резултати" :[ ] }

Нека стартираме кода отново:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Резултат:

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 } 

В този случай документ 4 не върна никаква стойност за масива. Всъщност дори не върна името на полето.

Нулеви и липсващи стойности

Ако операндът е нулев или липсва, $first връща null .

Да предположим, че вмъкваме следния документ:

{ "_id" :5, "player" :"Meg", "cores" :null }

Нека стартираме кода отново:

db.players.aggregate([ 
  {
    $project: {
        "firstScore": { 
          $first: "$scores" 
        }
    }
  } 
]) 

Резултат:

{ "_id" :1, "firstScore" :1 }{ "_id" :2, "firstScore" :8 }{ "_id" :3, "firstScore" :15 }{ "_id" :4 }{ "_id" :5, "firstScore" :нула }

Този път върна полето със стойност null .

Невалиден операнд

Операндът за $first трябва да се разреши до масив, нула или липсва. Предоставянето на невалиден операнд води до грешка.

За да демонстрираме това, нека се опитаме да използваме $first срещу player поле (което не е масив):

db.players.aggregate([ 
  {
    $project: {
        "firstPlayer": { 
          $first: "$player" 
        }
    }
  } 
]) 

Резултат:

Грешка:командата е неуспешна:{ "ok" :0, "errmsg" :"Аргументът на $first трябва да е масив, но е низ", "код" :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. MongoDB $inc

  2. MongoDb:Предимство от използването на ObjectID спрямо низ, съдържащ идентификатор?

  3. mongoDB префикс заместващ знак:пълнотекстово търсене ($text) намиране на част с низ за търсене

  4. UnhandledPromiseRejectionWarning:MongooseServerSelectionError

  5. MongoDB:преместване на поддокумент